using Avalonia.Data; using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml.MarkupExtensions; using CommunityToolkit.Mvvm.DependencyInjection; using System; namespace Flow.Launcher.Avalonia.Resource; /// /// Markup extension for accessing localized strings in XAML. /// Usage: Text="{i18n:Localize queryTextBoxPlaceholder}" /// public class LocalizeExtension : MarkupExtension { public LocalizeExtension() { } public LocalizeExtension(string key) { Key = key; } /// /// The translation key to look up. /// public string Key { get; set; } = string.Empty; /// /// Fallback value if translation is not found. /// public string? Fallback { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { if (string.IsNullOrEmpty(Key)) { return Fallback ?? "[No Key]"; } try { // Try to get I18n service from DI var i18n = Ioc.Default.GetService(); if (i18n != null && i18n.HasTranslation(Key)) { return i18n.GetTranslation(Key); } } catch { // Ioc.Default might throw if not configured yet } return Fallback ?? $"[{Key}]"; } } /// /// Static helper class for accessing translations from code-behind. /// public static class Translator { /// /// Get a translated string by key. /// /// The translation key /// The translated string or the key in brackets if not found public static string GetString(string key) { try { var i18n = Ioc.Default.GetService(); if (i18n == null) { return $"[{key}]"; } return i18n.GetTranslation(key); } catch { return $"[{key}]"; } } /// /// Get a translated string with format arguments. /// /// The translation key /// Format arguments /// The formatted translated string public static string GetString(string key, params object[] args) { var template = GetString(key); try { return string.Format(template, args); } catch { return template; } } }