| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- using System;
- using System.ComponentModel;
- using System.Windows;
- using System.Windows.Data;
- using System.Windows.Markup;
- namespace TeamAAS.Localization
- {
- /// <summary>
- /// XAML 标记扩展(共享版,供 Core / FlowEngine / 插件等程序集使用):
- /// 支持 {loc:Translate '保存配置'},语言切换时自动刷新。
- /// 主程序 TeamAAS.exe 内的 TeamAAS.Localization.TranslateExtension 与本类等价,
- /// 两者查询同一个 GlobalLocalizationManager 单例。
- /// </summary>
- [MarkupExtensionReturnType(typeof(BindingExpression))]
- public class TranslateExtension : MarkupExtension
- {
- /// <summary>要翻译的原文(中文)</summary>
- [ConstructorArgument("key")]
- public string Key { get; set; }
- /// <summary>可选的上下文(用于消歧义)</summary>
- 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;
- }
- }
- /// <summary>
- /// 翻译代理:监听语言切换事件,自动更新翻译
- /// </summary>
- 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;
- }
- }
|