From 5d80816f841be2806c7cd3372b00de008254c7dc Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Thu, 15 Jan 2026 01:17:29 -0800 Subject: [PATCH] Refactor i18n to be self-initializing via DI - Internationalization.Initialize() called in constructor when DI creates it - Remove InitializeInternationalization() method from App.axaml.cs - Update AvaloniaPublicAPI and LocalizeExtension to use Ioc.Default.GetService - Reorder ConfigureDI before i18n initialization --- Flow.Launcher.Avalonia/App.axaml.cs | 26 +++---------------- Flow.Launcher.Avalonia/AvaloniaPublicAPI.cs | 13 +++------- .../Resource/Internationalization.cs | 1 + .../Resource/LocalizeExtension.cs | 5 ++-- 4 files changed, 11 insertions(+), 34 deletions(-) diff --git a/Flow.Launcher.Avalonia/App.axaml.cs b/Flow.Launcher.Avalonia/App.axaml.cs index caedad3f7..fae4c6a64 100644 --- a/Flow.Launcher.Avalonia/App.axaml.cs +++ b/Flow.Launcher.Avalonia/App.axaml.cs @@ -23,14 +23,8 @@ public partial class App : Application private static readonly string ClassName = nameof(App); private Settings? _settings; private MainViewModel? _mainVM; - private Internationalization? _i18n; public static IPublicAPI? API { get; private set; } - - /// - /// Gets the internationalization service for translations. - /// - public static Internationalization? I18n { get; private set; } public override void Initialize() => AvaloniaXamlLoader.Load(this); @@ -39,7 +33,6 @@ public partial class App : Application if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { LoadSettings(); - InitializeInternationalization(); ConfigureDI(); API = Ioc.Default.GetRequiredService(); @@ -77,31 +70,18 @@ public partial class App : Application } } - private void InitializeInternationalization() - { - try - { - _i18n = new Internationalization(_settings!); - _i18n.Initialize(); - I18n = _i18n; - Log.Info(ClassName, "Internationalization initialized"); - } - catch (Exception e) - { - Log.Exception(ClassName, "Failed to initialize internationalization", e); - } - } - private void ConfigureDI() { var services = new ServiceCollection(); services.AddSingleton(_settings!); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(sp => new AvaloniaPublicAPI( sp.GetRequiredService(), - () => sp.GetRequiredService())); + () => sp.GetRequiredService(), + sp.GetRequiredService())); Ioc.Default.ConfigureServices(services.BuildServiceProvider()); } diff --git a/Flow.Launcher.Avalonia/AvaloniaPublicAPI.cs b/Flow.Launcher.Avalonia/AvaloniaPublicAPI.cs index da1cdc618..deac2575c 100644 --- a/Flow.Launcher.Avalonia/AvaloniaPublicAPI.cs +++ b/Flow.Launcher.Avalonia/AvaloniaPublicAPI.cs @@ -25,11 +25,13 @@ public class AvaloniaPublicAPI : IPublicAPI { private readonly Settings _settings; private readonly Func _getMainViewModel; + private readonly Internationalization _i18n; - public AvaloniaPublicAPI(Settings settings, Func getMainViewModel) + public AvaloniaPublicAPI(Settings settings, Func getMainViewModel, Internationalization i18n) { _settings = settings; _getMainViewModel = getMainViewModel; + _i18n = i18n; } #pragma warning disable CS0067 @@ -40,14 +42,7 @@ public class AvaloniaPublicAPI : IPublicAPI // Essential for plugins public void ChangeQuery(string query, bool requery = false) => _getMainViewModel().QueryText = query; - public string GetTranslation(string key) - { - var i18n = App.I18n; - if (i18n == null) - return key; - - return i18n.GetTranslation(key); - } + public string GetTranslation(string key) => _i18n.GetTranslation(key); public List GetAllPlugins() => PluginManager.AllPlugins; public MatchResult FuzzySearch(string query, string stringToCompare) => diff --git a/Flow.Launcher.Avalonia/Resource/Internationalization.cs b/Flow.Launcher.Avalonia/Resource/Internationalization.cs index 3c71969fb..b5cc19ecd 100644 --- a/Flow.Launcher.Avalonia/Resource/Internationalization.cs +++ b/Flow.Launcher.Avalonia/Resource/Internationalization.cs @@ -34,6 +34,7 @@ public class Internationalization public Internationalization(Settings settings) { _settings = settings; + Initialize(); } /// diff --git a/Flow.Launcher.Avalonia/Resource/LocalizeExtension.cs b/Flow.Launcher.Avalonia/Resource/LocalizeExtension.cs index 9b6c673be..e88ec87e2 100644 --- a/Flow.Launcher.Avalonia/Resource/LocalizeExtension.cs +++ b/Flow.Launcher.Avalonia/Resource/LocalizeExtension.cs @@ -1,6 +1,7 @@ using Avalonia.Data; using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml.MarkupExtensions; +using CommunityToolkit.Mvvm.DependencyInjection; using System; namespace Flow.Launcher.Avalonia.Resource; @@ -37,7 +38,7 @@ public class LocalizeExtension : MarkupExtension return Fallback ?? "[No Key]"; } - var i18n = App.I18n; + var i18n = Ioc.Default.GetService(); if (i18n == null) { return Fallback ?? $"[{Key}]"; @@ -64,7 +65,7 @@ public static class Translator /// The translated string or the key in brackets if not found public static string GetString(string key) { - var i18n = App.I18n; + var i18n = Ioc.Default.GetService(); if (i18n == null) { return $"[{key}]";