44 lines
1.5 KiB
C#
44 lines
1.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using ClaudeDo.Localization;
|
|
|
|
namespace ClaudeDo.Ui.Localization;
|
|
|
|
/// Ambient access to the active localizer for code-built (ViewModel) strings.
|
|
/// Set once at startup. Defaults to a key-echo localizer so unit tests that
|
|
/// construct ViewModels without startup wiring do not crash.
|
|
public static class Loc
|
|
{
|
|
private static ILocalizer _current = new KeyEchoLocalizer();
|
|
|
|
public static ILocalizer Current
|
|
{
|
|
get => _current;
|
|
set
|
|
{
|
|
if (_current is not null) _current.LanguageChanged -= OnInnerChanged;
|
|
_current = value;
|
|
_current.LanguageChanged += OnInnerChanged;
|
|
OnInnerChanged(value, EventArgs.Empty);
|
|
}
|
|
}
|
|
|
|
public static event EventHandler? LanguageChanged;
|
|
|
|
private static void OnInnerChanged(object? sender, EventArgs e) =>
|
|
LanguageChanged?.Invoke(sender, e);
|
|
|
|
public static string T(string key) => Current[key];
|
|
public static string T(string key, params object[] args) => Current.Get(key, args);
|
|
|
|
private sealed class KeyEchoLocalizer : ILocalizer
|
|
{
|
|
public string this[string key] => key;
|
|
public string Get(string key, params object[] args) => key;
|
|
public string CurrentCode => "en";
|
|
public IReadOnlyList<LanguageOption> AvailableLanguages => Array.Empty<LanguageOption>();
|
|
public void SetLanguage(string code) { }
|
|
public event EventHandler? LanguageChanged { add { } remove { } }
|
|
}
|
|
}
|