WPFLocalizeExtension 多语言组件使用和原理及拓展

  1. Nuget WPFLocalizeExtension

  2. YourAssembly.Resources(自行添加) 文件夹添加Strings.xxx.resx (Strings.zh-CN.resx/Strings.en-US.resx)

  3. 可以在 XAML 代码的整个 VisualTree 中更改任意位置的 ResxLocalizationProvider.DefaultAssembly 和 ResxLocalizationProvider.DefaultDictionary 的值
    3.1在MainWindow 中添加


     xmlns:lex="https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension"
     lex:LocalizeDictionary.DesignCulture="en-US"
     lex:ResxLocalizationProvider.DefaultAssembly="WpfLocalizationTest"(这里使用了当前Assembly)
     lex:ResxLocalizationProvider.DefaultDictionary="Resources.Strings"(注意这里是个‘.’)

3.2 在其他视图中添


     xmlns:lex="https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension"
     lex:LocalizeDictionary.DesignCulture="en-US"
     lex:ResxLocalizationProvider.DefaultAssembly="OtherAssemblyName"(可以在当前视图使用其他Assembly的Dictionay)
     lex:ResxLocalizationProvider.DefaultDictionary="OtherResourceName"

3.3 DefaultDictionary此依赖属性在赋值的时候会将当前视图和新值的名称传入,当前视图的Assembly可以反射出来再根据传入的Resource名称可以将此名称的ResourceManager找出来加入到lex:LocalizeDictionary.DefaultProvider = ResxLocalizationProvider.Instance.ResourceManagerList 这个静态类的成员集合中 再结合MarkupExtension lex:Loc取到当前视图在ResourceManagerList 的ResouceManager由Key取到正确的value;
3.3.1 DefaultDictionary的多次赋值会多次查找关联ResourceManager添加到唯一集合,在结合lex:loc可以给不同的视图和不同的RM配合使用

  1. 控件使用的三种方法
    https://github.com/XAMLMarkupExtensions/WPFLocalizeExtension/blob/master/docs/Multiple-assemblies-and-dictionaries.md
  <Button  Content="{lex:Loc T_ADD}" Resx中有KEY T_ADD 
  <Button x:Name="UpdateBtn"  Content="{lex:Loc}" Resx中有KEY UPDATEBTN_CONTENT 其他属性也可以使用类似方法
  <Button  Content="{lex:Loc WpfLocalizationTest:Resources.Strings:T_ADD}" (注意这里是个‘.’ WpfLocalizationTest =AssemblyName;Resources.Strings =DictName;T_ADD =KeyName)

4.1 LocExtension的属性使用

  1. 动态切换语言
  WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = System.Globalization.CultureInfo.GetCultureInfo("zh-CN");这个Instance就是ResxLocalizationProvider

对此Culture 赋值会触发LocalizeDictionary某个事件的Listener(LocExtenssion类,此类又继承于NestedMarkupExtension)收到此事件(MarkupExtension的重载函数OnFirstTargetAdded 在初次赋值会被调用注册LocalizeDictionary的DictionaryEvent事件)
LocalizeDictionary--(DictionaryEvent)-->LocExtenssion(call ResourceChanged function)

  1. 代码中使用多语言
  WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = System.Globalization.CultureInfo.GetCultureInfo("zh-CN");
  var obj=LocalizeDictionary.Instance.GetLocalizedObject("WpfLocalizationTest", "Resources.Strings", "T_ADD", WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture);
  MessageBox.Show(obj.ToString());
  1. 手动注册程序集和资源
    7.1 使用依赖对象注入(WPFLocalizeExtension底层需要查找此对象的程序集)
  public  class RegisteResourceManager:DependencyObject
{
	private static RegisteResourceManager _instance;
	private static RegisteResourceManager Instance { get { if (_instance == null) { return _instance=new RegisteResourceManager(); } else { return _instance; } } }
	private RegisteResourceManager() 
	{ 

	}	

	public static void RegisterResx(string assemblyName,string dictName)
	{
		ResxLocalizationProvider.SetDefaultAssembly(RegisteResourceManager.Instance, assemblyName);
		ResxLocalizationProvider.SetDefaultDictionary(RegisteResourceManager.Instance, dictName);
	}
}

7.2 使用

var obj1 = LocalizeDictionary.Instance.GetLocalizedObject("WpfLocalizationTest", "ManualResxs.Strs", "T_REFRESH", WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture);
MessageBox.Show(obj1.ToString());
  1. 缺失翻译处理
LocalizeDictionary.Instance.MissingKeyEvent += Instance_MissingKeyEvent;  XAML视图找不到key触发
LocalizeDictionary.Instance.DefaultProvider.ProviderError  += ...  ResxResourceManager找不到key触发
posted @   YYAN1987  阅读(193)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示