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;
}
}
}