Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions Flow.Launcher.Core/Plugin/PluginManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -205,9 +205,6 @@ public static async Task InitializePluginsAsync()
}
}

InternationalizationManager.Instance.AddPluginLanguageDirectories(GetPluginsForInterface<IPluginI18n>());
InternationalizationManager.Instance.ChangeLanguage(Ioc.Default.GetRequiredService<Settings>().Language);

if (failedPlugins.Any())
{
var failed = string.Join(",", failedPlugins.Select(x => x.Metadata.Name));
Expand Down
51 changes: 39 additions & 12 deletions Flow.Launcher.Core/Resource/Internationalization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ private static string GetSystemLanguageCodeAtStartup()
return DefaultLanguageCode;
}

internal void AddPluginLanguageDirectories(IEnumerable<PluginPair> plugins)
private void AddPluginLanguageDirectories()
{
foreach (var plugin in plugins)
foreach (var plugin in PluginManager.GetPluginsForInterface<IPluginI18n>())
{
var location = Assembly.GetAssembly(plugin.Plugin.GetType()).Location;
var dir = Path.GetDirectoryName(location);
Expand All @@ -96,6 +96,32 @@ private void LoadDefaultLanguage()
_oldResources.Clear();
}

/// <summary>
/// Initialize language. Will change app language and plugin language based on settings.
/// </summary>
public async Task InitializeLanguageAsync()
{
// Get actual language
var languageCode = _settings.Language;
if (languageCode == Constant.SystemLanguageCode)
{
languageCode = SystemLanguageCode;
}

// Get language by language code and change language
var language = GetLanguageByLanguageCode(languageCode);

// Add plugin language directories first so that we can load language files from plugins
AddPluginLanguageDirectories();

// Change language
await ChangeLanguageAsync(language);
}

/// <summary>
/// Change language during runtime. Will change app language and plugin language & save settings.
/// </summary>
/// <param name="languageCode"></param>
public void ChangeLanguage(string languageCode)
{
languageCode = languageCode.NonNull();
Expand All @@ -110,7 +136,12 @@ public void ChangeLanguage(string languageCode)

// Get language by language code and change language
var language = GetLanguageByLanguageCode(languageCode);
ChangeLanguage(language, isSystem);

// Change language
_ = ChangeLanguageAsync(language);

// Save settings
_settings.Language = isSystem ? Constant.SystemLanguageCode : language.LanguageCode;
}

private Language GetLanguageByLanguageCode(string languageCode)
Expand All @@ -128,26 +159,22 @@ private Language GetLanguageByLanguageCode(string languageCode)
}
}

private void ChangeLanguage(Language language, bool isSystem)
private async Task ChangeLanguageAsync(Language language)
{
language = language.NonNull();

// Remove old language files and load language
RemoveOldLanguageFiles();
if (language != AvailableLanguages.English)
{
LoadLanguage(language);
}

// Culture of main thread
// Use CreateSpecificCulture to preserve possible user-override settings in Windows, if Flow's language culture is the same as Windows's
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture(language.LanguageCode);
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture;

// Raise event after culture is set
_settings.Language = isSystem ? Constant.SystemLanguageCode : language.LanguageCode;
_ = Task.Run(() =>
{
UpdatePluginMetadataTranslations();
});
// Raise event for plugins after culture is set
await Task.Run(UpdatePluginMetadataTranslations);
}

public bool PromptShouldUsePinyin(string languageCodeToSet)
Expand Down
9 changes: 5 additions & 4 deletions Flow.Launcher/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,14 @@ await Stopwatch.NormalAsync("|App.OnStartup|Startup cost", async () =>
// Register ResultsUpdated event after all plugins are loaded
Ioc.Default.GetRequiredService<MainViewModel>().RegisterResultsUpdatedEvent();

// Change language after all plugins are initialized
// TODO: Clean InternationalizationManager.Instance and InternationalizationManager.Instance.GetTranslation in future
Ioc.Default.GetRequiredService<Internationalization>().ChangeLanguage(_settings.Language);

Http.Proxy = _settings.Proxy;

await PluginManager.InitializePluginsAsync();

// Change language after all plugins are initialized because we need to update plugin title based on their api
// TODO: Clean InternationalizationManager.Instance and InternationalizationManager.Instance.GetTranslation in future
await Ioc.Default.GetRequiredService<Internationalization>().InitializeLanguageAsync();

await imageLoadertask;

var window = new MainWindow();
Expand Down
Loading