@@ -18,23 +18,52 @@ public class Internationalization
1818 {
1919 public Settings Settings { get ; set ; }
2020 private const string Folder = "Languages" ;
21+ private const string DefaultLanguageCode = "en" ;
2122 private const string DefaultFile = "en.xaml" ;
2223 private const string Extension = ".xaml" ;
2324 private readonly List < string > _languageDirectories = new List < string > ( ) ;
2425 private readonly List < ResourceDictionary > _oldResources = new List < ResourceDictionary > ( ) ;
26+ private readonly string SystemLanguageCode ;
2527
2628 public Internationalization ( )
2729 {
2830 AddFlowLauncherLanguageDirectory ( ) ;
31+ SystemLanguageCode = GetSystemLanguageCodeAtStartup ( ) ;
2932 }
3033
31-
3234 private void AddFlowLauncherLanguageDirectory ( )
3335 {
3436 var directory = Path . Combine ( Constant . ProgramDirectory , Folder ) ;
3537 _languageDirectories . Add ( directory ) ;
3638 }
3739
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+ }
3867
3968 internal void AddPluginLanguageDirectories ( IEnumerable < PluginPair > plugins )
4069 {
@@ -68,8 +97,18 @@ private void LoadDefaultLanguage()
6897 public void ChangeLanguage ( string languageCode )
6998 {
7099 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 ) ;
73112 }
74113
75114 private Language GetLanguageByLanguageCode ( string languageCode )
@@ -87,11 +126,10 @@ private Language GetLanguageByLanguageCode(string languageCode)
87126 }
88127 }
89128
90- public void ChangeLanguage ( Language language )
129+ private void ChangeLanguage ( Language language , bool isSystem )
91130 {
92131 language = language . NonNull ( ) ;
93132
94-
95133 RemoveOldLanguageFiles ( ) ;
96134 if ( language != AvailableLanguages . English )
97135 {
@@ -103,7 +141,7 @@ public void ChangeLanguage(Language language)
103141 CultureInfo . CurrentUICulture = CultureInfo . CurrentCulture ;
104142
105143 // Raise event after culture is set
106- Settings . Language = language . LanguageCode ;
144+ Settings . Language = isSystem ? Constant . SystemLanguageCode : language . LanguageCode ;
107145 _ = Task . Run ( ( ) =>
108146 {
109147 UpdatePluginMetadataTranslations ( ) ;
@@ -167,7 +205,9 @@ private void LoadLanguage(Language language)
167205
168206 public List < Language > LoadAvailableLanguages ( )
169207 {
170- return AvailableLanguages . GetAvailableLanguages ( ) ;
208+ var list = AvailableLanguages . GetAvailableLanguages ( ) ;
209+ list . Insert ( 0 , new Language ( Constant . SystemLanguageCode , AvailableLanguages . GetSystemTranslation ( SystemLanguageCode ) ) ) ;
210+ return list ;
171211 }
172212
173213 public string GetTranslation ( string key )
0 commit comments