Skip to content

Commit dfad11c

Browse files
committed
Fix language change issue
1 parent ddec1bd commit dfad11c

File tree

3 files changed

+57
-32
lines changed

3 files changed

+57
-32
lines changed

Flow.Launcher.Core/Plugin/PluginManager.cs

Lines changed: 0 additions & 3 deletions
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

Lines changed: 52 additions & 25 deletions
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,44 +136,45 @@ public void ChangeLanguage(string languageCode)
110136

111137
// Get language by language code and change language
112138
var language = GetLanguageByLanguageCode(languageCode);
113-
ChangeLanguage(language, isSystem);
114-
}
115139

116-
private Language GetLanguageByLanguageCode(string languageCode)
117-
{
118-
var lowercase = languageCode.ToLower();
119-
var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.ToLower() == lowercase);
120-
if (language == null)
121-
{
122-
Log.Error($"|Internationalization.GetLanguageByLanguageCode|Language code can't be found <{languageCode}>");
123-
return AvailableLanguages.English;
124-
}
125-
else
126-
{
127-
return language;
128-
}
140+
// Change language
141+
_ = ChangeLanguageAsync(language);
142+
143+
// Save settings
144+
_settings.Language = isSystem ? Constant.SystemLanguageCode : language.LanguageCode;
129145
}
130146

131-
private void ChangeLanguage(Language language, bool isSystem)
147+
private async Task ChangeLanguageAsync(Language language)
132148
{
133-
language = language.NonNull();
134-
149+
// Remove old language files and load language
135150
RemoveOldLanguageFiles();
136151
if (language != AvailableLanguages.English)
137152
{
138153
LoadLanguage(language);
139154
}
155+
140156
// Culture of main thread
141157
// Use CreateSpecificCulture to preserve possible user-override settings in Windows, if Flow's language culture is the same as Windows's
142158
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode);
143159
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture;
144160

145-
// Raise event after culture is set
146-
_settings.Language = isSystem ? Constant.SystemLanguageCode : language.LanguageCode;
147-
_ = Task.Run(() =>
161+
// Raise event for plugins after culture is set
162+
await Task.Run(UpdatePluginMetadataTranslations);
163+
}
164+
165+
private static Language GetLanguageByLanguageCode(string languageCode)
166+
{
167+
var lowercase = languageCode.ToLower();
168+
var language = AvailableLanguages.GetAvailableLanguages().FirstOrDefault(o => o.LanguageCode.ToLower() == lowercase);
169+
if (language == null)
170+
{
171+
Log.Error($"|Internationalization.GetLanguageByLanguageCode|Language code can't be found <{languageCode}>");
172+
return AvailableLanguages.English;
173+
}
174+
else
148175
{
149-
UpdatePluginMetadataTranslations();
150-
});
176+
return language;
177+
}
151178
}
152179

153180
public bool PromptShouldUsePinyin(string languageCodeToSet)

Flow.Launcher/App.xaml.cs

Lines changed: 5 additions & 4 deletions
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)