WPFLocalizeExtension 多语言组件使用和原理及拓展
-
Nuget WPFLocalizeExtension
-
YourAssembly.Resources(自行添加) 文件夹添加Strings.xxx.resx (Strings.zh-CN.resx/Strings.en-US.resx)
-
可以在 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配合使用
<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的属性使用
- 动态切换语言
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)
- 代码中使用多语言
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());
- 手动注册程序集和资源
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());
- 缺失翻译处理
LocalizeDictionary.Instance.MissingKeyEvent += Instance_MissingKeyEvent; XAML视图找不到key触发
LocalizeDictionary.Instance.DefaultProvider.ProviderError += ... ResxResourceManager找不到key触发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)