@@ -67,9 +67,9 @@ private static string GetSystemLanguageCodeAtStartup()
6767 return DefaultLanguageCode ;
6868 }
6969
70- internal void AddPluginLanguageDirectories ( IEnumerable < PluginPair > plugins )
70+ private void AddPluginLanguageDirectories ( )
7171 {
72- foreach ( var plugin in plugins )
72+ foreach ( var plugin in PluginManager . GetPluginsForInterface < IPluginI18n > ( ) )
7373 {
7474 var location = Assembly . GetAssembly ( plugin . Plugin . GetType ( ) ) . Location ;
7575 var dir = Path . GetDirectoryName ( location ) ;
@@ -96,6 +96,32 @@ private void LoadDefaultLanguage()
9696 _oldResources . Clear ( ) ;
9797 }
9898
99+ /// <summary>
100+ /// Initialize language. Will change app language and plugin language based on settings.
101+ /// </summary>
102+ public async Task InitializeLanguageAsync ( )
103+ {
104+ // Get actual language
105+ var languageCode = _settings . Language ;
106+ if ( languageCode == Constant . SystemLanguageCode )
107+ {
108+ languageCode = SystemLanguageCode ;
109+ }
110+
111+ // Get language by language code and change language
112+ var language = GetLanguageByLanguageCode ( languageCode ) ;
113+
114+ // Add plugin language directories first so that we can load language files from plugins
115+ AddPluginLanguageDirectories ( ) ;
116+
117+ // Change language
118+ await ChangeLanguageAsync ( language ) ;
119+ }
120+
121+ /// <summary>
122+ /// Change language during runtime. Will change app language and plugin language & save settings.
123+ /// </summary>
124+ /// <param name="languageCode"></param>
99125 public void ChangeLanguage ( string languageCode )
100126 {
101127 languageCode = languageCode . NonNull ( ) ;
@@ -110,7 +136,12 @@ public void ChangeLanguage(string languageCode)
110136
111137 // Get language by language code and change language
112138 var language = GetLanguageByLanguageCode ( languageCode ) ;
113- ChangeLanguage ( language , isSystem ) ;
139+
140+ // Change language
141+ _ = ChangeLanguageAsync ( language ) ;
142+
143+ // Save settings
144+ _settings . Language = isSystem ? Constant . SystemLanguageCode : language . LanguageCode ;
114145 }
115146
116147 private Language GetLanguageByLanguageCode ( string languageCode )
@@ -128,26 +159,22 @@ private Language GetLanguageByLanguageCode(string languageCode)
128159 }
129160 }
130161
131- private void ChangeLanguage ( Language language , bool isSystem )
162+ private async Task ChangeLanguageAsync ( Language language )
132163 {
133- language = language . NonNull ( ) ;
134-
164+ // Remove old language files and load language
135165 RemoveOldLanguageFiles ( ) ;
136166 if ( language != AvailableLanguages . English )
137167 {
138168 LoadLanguage ( language ) ;
139169 }
170+
140171 // Culture of main thread
141172 // Use CreateSpecificCulture to preserve possible user-override settings in Windows, if Flow's language culture is the same as Windows's
142173 CultureInfo . CurrentCulture = CultureInfo . CreateSpecificCulture ( language . LanguageCode ) ;
143174 CultureInfo . CurrentUICulture = CultureInfo . CurrentCulture ;
144175
145- // Raise event after culture is set
146- _settings . Language = isSystem ? Constant . SystemLanguageCode : language . LanguageCode ;
147- _ = Task . Run ( ( ) =>
148- {
149- UpdatePluginMetadataTranslations ( ) ;
150- } ) ;
176+ // Raise event for plugins after culture is set
177+ await Task . Run ( UpdatePluginMetadataTranslations ) ;
151178 }
152179
153180 public bool PromptShouldUsePinyin ( string languageCodeToSet )
0 commit comments