using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace TeamAAS.Localization
{
///
/// XAML 标记扩展(共享版,供 Core / FlowEngine / 插件等程序集使用):
/// 支持 {loc:Translate '保存配置'},语言切换时自动刷新。
/// 主程序 TeamAAS.exe 内的 TeamAAS.Localization.TranslateExtension 与本类等价,
/// 两者查询同一个 GlobalLocalizationManager 单例。
///
[MarkupExtensionReturnType(typeof(BindingExpression))]
public class TranslateExtension : MarkupExtension
{
/// 要翻译的原文(中文)
[ConstructorArgument("key")]
public string Key { get; set; }
/// 可选的上下文(用于消歧义)
public string Context { get; set; }
public TranslateExtension()
{
}
public TranslateExtension(string key)
{
Key = key;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (string.IsNullOrWhiteSpace(Key))
return "[未设置翻译Key]";
if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
return Key;
var proxy = new SharedTranslationProxy(Key, Context);
var binding = new Binding("Value")
{
Source = proxy,
Mode = BindingMode.OneWay,
};
if (serviceProvider.GetService(typeof(IProvideValueTarget)) is IProvideValueTarget target
&& target.TargetObject is DependencyObject
&& target.TargetProperty is DependencyProperty)
{
return binding.ProvideValue(serviceProvider);
}
return proxy.Value;
}
}
///
/// 翻译代理:监听语言切换事件,自动更新翻译
///
internal class SharedTranslationProxy : INotifyPropertyChanged
{
private readonly string _key;
private readonly string _context;
public SharedTranslationProxy(string key, string context = null)
{
_key = key;
_context = context;
GlobalLocalizationManager.Instance.LanguageChanged += OnLanguageChanged;
}
public string Value => GlobalLocalizationManager.Instance.Translate(_key, _context);
private void OnLanguageChanged(object sender, EventArgs e)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}