Skip to content

Commit 298af4d

Browse files
authored
Merge pull request #3376 from Jack251970/change_language
Fix Language Change Issue
2 parents ddec1bd + a3193cf commit 298af4d

File tree

3 files changed

+44
-19
lines changed

3 files changed

+44
-19
lines changed

Flow.Launcher.Core/Plugin/PluginManager.cs

-3
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,6 @@ public static async Task InitializePluginsAsync()
205205
}
206206
}
207207

208-
InternationalizationManager.Instance.AddPluginLanguageDirectories(GetPluginsForInterface<IPluginI18n>());
209-
InternationalizationManager.Instance.ChangeLanguage(Ioc.Default.GetRequiredService<Settings>().Language);
210-
211208
if (failedPlugins.Any())
212209
{
213210
var failed = string.Join(",", failedPlugins.Select(x => x.Metadata.Name));

Flow.Launcher.Core/Resource/Internationalization.cs

+39-12
Original file line numberDiff line numberDiff line change
@@ -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)

Flow.Launcher/App.xaml.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,14 @@ await Stopwatch.NormalAsync("|App.OnStartup|Startup cost", async () =>
132132
// Register ResultsUpdated event after all plugins are loaded
133133
Ioc.Default.GetRequiredService<MainViewModel>().RegisterResultsUpdatedEvent();
134134

135-
// Change language after all plugins are initialized
136-
// TODO: Clean InternationalizationManager.Instance and InternationalizationManager.Instance.GetTranslation in future
137-
Ioc.Default.GetRequiredService<Internationalization>().ChangeLanguage(_settings.Language);
138-
139135
Http.Proxy = _settings.Proxy;
140136

141137
await PluginManager.InitializePluginsAsync();
138+
139+
// Change language after all plugins are initialized because we need to update plugin title based on their api
140+
// TODO: Clean InternationalizationManager.Instance and InternationalizationManager.Instance.GetTranslation in future
141+
await Ioc.Default.GetRequiredService<Internationalization>().InitializeLanguageAsync();
142+
142143
await imageLoadertask;
143144

144145
var window = new MainWindow();

0 commit comments

Comments
 (0)