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
This commit is contained in:
Hongtao Zhang 2026-01-15 01:17:29 -08:00
parent 36e3530a59
commit 5d80816f84
4 changed files with 11 additions and 34 deletions

View file

@ -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; }
/// <summary>
/// Gets the internationalization service for translations.
/// </summary>
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<IPublicAPI>();
@ -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<IAlphabet, PinyinAlphabet>();
services.AddSingleton<StringMatcher>();
services.AddSingleton<Internationalization>();
services.AddSingleton<MainViewModel>();
services.AddSingleton<IPublicAPI>(sp => new AvaloniaPublicAPI(
sp.GetRequiredService<Settings>(),
() => sp.GetRequiredService<MainViewModel>()));
() => sp.GetRequiredService<MainViewModel>(),
sp.GetRequiredService<Internationalization>()));
Ioc.Default.ConfigureServices(services.BuildServiceProvider());
}

View file

@ -25,11 +25,13 @@ public class AvaloniaPublicAPI : IPublicAPI
{
private readonly Settings _settings;
private readonly Func<MainViewModel> _getMainViewModel;
private readonly Internationalization _i18n;
public AvaloniaPublicAPI(Settings settings, Func<MainViewModel> getMainViewModel)
public AvaloniaPublicAPI(Settings settings, Func<MainViewModel> 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<PluginPair> GetAllPlugins() => PluginManager.AllPlugins;
public MatchResult FuzzySearch(string query, string stringToCompare) =>

View file

@ -34,6 +34,7 @@ public class Internationalization
public Internationalization(Settings settings)
{
_settings = settings;
Initialize();
}
/// <summary>

View file

@ -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<Internationalization>();
if (i18n == null)
{
return Fallback ?? $"[{Key}]";
@ -64,7 +65,7 @@ public static class Translator
/// <returns>The translated string or the key in brackets if not found</returns>
public static string GetString(string key)
{
var i18n = App.I18n;
var i18n = Ioc.Default.GetService<Internationalization>();
if (i18n == null)
{
return $"[{key}]";