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