1- using System ;
1+ using System ;
22using System . Collections . Generic ;
33using System . Globalization ;
44using System . IO ;
1414
1515namespace Flow . Launcher . Core . Resource
1616{
17- public class Internationalization
17+ public class Internationalization : IDisposable
1818 {
1919 private static readonly string ClassName = nameof ( Internationalization ) ;
2020
@@ -30,6 +30,7 @@ public class Internationalization
3030 private readonly List < string > _languageDirectories = [ ] ;
3131 private readonly List < ResourceDictionary > _oldResources = [ ] ;
3232 private static string SystemLanguageCode ;
33+ private readonly SemaphoreSlim _langChangeLock = new ( 1 , 1 ) ;
3334
3435 public Internationalization ( Settings settings )
3536 {
@@ -185,20 +186,33 @@ private static Language GetLanguageByLanguageCode(string languageCode)
185186
186187 private async Task ChangeLanguageAsync ( Language language , bool updateMetadata = true )
187188 {
188- // Remove old language files and load language
189- RemoveOldLanguageFiles ( ) ;
190- if ( language != AvailableLanguages . English )
189+ await _langChangeLock . WaitAsync ( ) ;
190+
191+ try
191192 {
192- LoadLanguage ( language ) ;
193- }
193+ // Remove old language files and load language
194+ RemoveOldLanguageFiles ( ) ;
195+ if ( language != AvailableLanguages . English )
196+ {
197+ LoadLanguage ( language ) ;
198+ }
194199
195- // Change culture info
196- ChangeCultureInfo ( language . LanguageCode ) ;
200+ // Change culture info
201+ ChangeCultureInfo ( language . LanguageCode ) ;
197202
198- if ( updateMetadata )
203+ if ( updateMetadata )
204+ {
205+ // Raise event for plugins after culture is set
206+ await Task . Run ( UpdatePluginMetadataTranslations ) ;
207+ }
208+ }
209+ catch ( Exception e )
199210 {
200- // Raise event for plugins after culture is set
201- await Task . Run ( UpdatePluginMetadataTranslations ) ;
211+ API . LogException ( ClassName , $ "Failed to change language to <{ language . LanguageCode } >", e ) ;
212+ }
213+ finally
214+ {
215+ _langChangeLock . Release ( ) ;
202216 }
203217 }
204218
@@ -257,6 +271,7 @@ private void RemoveOldLanguageFiles()
257271 {
258272 dicts . Remove ( r ) ;
259273 }
274+ _oldResources . Clear ( ) ;
260275 }
261276
262277 private void LoadLanguage ( Language language )
@@ -368,5 +383,15 @@ public static void UpdatePluginMetadataTranslations()
368383 }
369384
370385 #endregion
386+
387+ #region IDisposable
388+
389+ public void Dispose ( )
390+ {
391+ RemoveOldLanguageFiles ( ) ;
392+ _langChangeLock . Dispose ( ) ;
393+ }
394+
395+ #endregion
371396 }
372397}
0 commit comments