@@ -18,23 +18,52 @@ public class Internationalization
18
18
{
19
19
public Settings Settings { get ; set ; }
20
20
private const string Folder = "Languages" ;
21
+ private const string DefaultLanguageCode = "en" ;
21
22
private const string DefaultFile = "en.xaml" ;
22
23
private const string Extension = ".xaml" ;
23
24
private readonly List < string > _languageDirectories = new List < string > ( ) ;
24
25
private readonly List < ResourceDictionary > _oldResources = new List < ResourceDictionary > ( ) ;
26
+ private readonly string SystemLanguageCode ;
25
27
26
28
public Internationalization ( )
27
29
{
28
30
AddFlowLauncherLanguageDirectory ( ) ;
31
+ SystemLanguageCode = GetSystemLanguageCodeAtStartup ( ) ;
29
32
}
30
33
31
-
32
34
private void AddFlowLauncherLanguageDirectory ( )
33
35
{
34
36
var directory = Path . Combine ( Constant . ProgramDirectory , Folder ) ;
35
37
_languageDirectories . Add ( directory ) ;
36
38
}
37
39
40
+ private static string GetSystemLanguageCodeAtStartup ( )
41
+ {
42
+ var availableLanguages = AvailableLanguages . GetAvailableLanguages ( ) ;
43
+
44
+ // Retrieve the language identifiers for the current culture.
45
+ // ChangeLanguage method overrides the CultureInfo.CurrentCulture, so this needs to
46
+ // be called at startup in order to get the correct lang code of system.
47
+ var currentCulture = CultureInfo . CurrentCulture ;
48
+ var twoLetterCode = currentCulture . TwoLetterISOLanguageName ;
49
+ var threeLetterCode = currentCulture . ThreeLetterISOLanguageName ;
50
+ var fullName = currentCulture . Name ;
51
+
52
+ // Try to find a match in the available languages list
53
+ foreach ( var language in availableLanguages )
54
+ {
55
+ var languageCode = language . LanguageCode ;
56
+
57
+ if ( string . Equals ( languageCode , twoLetterCode , StringComparison . OrdinalIgnoreCase ) ||
58
+ string . Equals ( languageCode , threeLetterCode , StringComparison . OrdinalIgnoreCase ) ||
59
+ string . Equals ( languageCode , fullName , StringComparison . OrdinalIgnoreCase ) )
60
+ {
61
+ return languageCode ;
62
+ }
63
+ }
64
+
65
+ return DefaultLanguageCode ;
66
+ }
38
67
39
68
internal void AddPluginLanguageDirectories ( IEnumerable < PluginPair > plugins )
40
69
{
@@ -68,8 +97,18 @@ private void LoadDefaultLanguage()
68
97
public void ChangeLanguage ( string languageCode )
69
98
{
70
99
languageCode = languageCode . NonNull ( ) ;
71
- Language language = GetLanguageByLanguageCode ( languageCode ) ;
72
- ChangeLanguage ( language ) ;
100
+
101
+ // Get actual language if language code is system
102
+ var isSystem = false ;
103
+ if ( languageCode == Constant . SystemLanguageCode )
104
+ {
105
+ languageCode = SystemLanguageCode ;
106
+ isSystem = true ;
107
+ }
108
+
109
+ // Get language by language code and change language
110
+ var language = GetLanguageByLanguageCode ( languageCode ) ;
111
+ ChangeLanguage ( language , isSystem ) ;
73
112
}
74
113
75
114
private Language GetLanguageByLanguageCode ( string languageCode )
@@ -87,11 +126,10 @@ private Language GetLanguageByLanguageCode(string languageCode)
87
126
}
88
127
}
89
128
90
- public void ChangeLanguage ( Language language )
129
+ private void ChangeLanguage ( Language language , bool isSystem )
91
130
{
92
131
language = language . NonNull ( ) ;
93
132
94
-
95
133
RemoveOldLanguageFiles ( ) ;
96
134
if ( language != AvailableLanguages . English )
97
135
{
@@ -103,7 +141,7 @@ public void ChangeLanguage(Language language)
103
141
CultureInfo . CurrentUICulture = CultureInfo . CurrentCulture ;
104
142
105
143
// Raise event after culture is set
106
- Settings . Language = language . LanguageCode ;
144
+ Settings . Language = isSystem ? Constant . SystemLanguageCode : language . LanguageCode ;
107
145
_ = Task . Run ( ( ) =>
108
146
{
109
147
UpdatePluginMetadataTranslations ( ) ;
@@ -167,7 +205,9 @@ private void LoadLanguage(Language language)
167
205
168
206
public List < Language > LoadAvailableLanguages ( )
169
207
{
170
- return AvailableLanguages . GetAvailableLanguages ( ) ;
208
+ var list = AvailableLanguages . GetAvailableLanguages ( ) ;
209
+ list . Insert ( 0 , new Language ( Constant . SystemLanguageCode , AvailableLanguages . GetSystemTranslation ( SystemLanguageCode ) ) ) ;
210
+ return list ;
171
211
}
172
212
173
213
public string GetTranslation ( string key )
0 commit comments