首页 > 其他分享 >WPFLocalizeExtension 多语言组件使用和原理及拓展

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

时间:2024-10-26 23:21:30浏览次数:1  
标签:拓展 Instance ResxLocalizationProvider 视图 WPFLocalizeExtension 组件 LocalizeDictiona

  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配合使用

  4. 控件使用
    <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)
    https://github.com/XAMLMarkupExtensions/WPFLocalizeExtension/blob/master/docs/Multiple-assemblies-and-dictionaries.md

  5. 动态切换语言
    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)

  6. 代码中使用多语言
    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. 手动注册程序集和资源
    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());
5. 缺失翻译处理
5.1 LocalizeDictionary.Instance.MissingKeyEvent += Instance_MissingKeyEvent; XAML视图找不到key触发
5.2 LocalizeDictionary.Instance.DefaultProvider.ProviderError += ... ResxResourceManager找不到key触发

标签:拓展,Instance,ResxLocalizationProvider,视图,WPFLocalizeExtension,组件,LocalizeDictiona
From: https://www.cnblogs.com/yyan1987/p/18504573

相关文章

  • 了解React Native应用中的createNativeStackNavigator 组件
    createNativeStackNavigator是ReactNavigation库中的一个组件,专门用于在ReactNative应用中创建原生的堆栈导航器(StackNavigator)。这个组件允许你在应用中实现页面之间的导航,如从主页面跳转到详情页面,然后再返回主页面。与传统的JavaScript堆栈导航器相比,createNat......
  • uni-app 扫码插件推荐:基于支付宝 mPaaS 扫码组件开发,支持 Android 和 iOS
    一.前言之前说到,我的一个uni-app项目遭到用户吐槽:“你们这个App扫码的正确率太低了,尤其是安卓的设备。经常性的扫码扫不出来,就算是扫出来了,也是错误的结果!”面对以上这个问题,我在当时的项目是使用了一个基于安卓原生zxing扫码插件实现的,虽然扫码效率可观,但是它也有一......
  • 函数式组件
    函数式组件:通过函数调用的方式添加组件。传统调用组件方式的困扰:<Childv-if='isShow':msg='msg'/><botton@click='btnClick'/>importChildfrom'@/components/Child'letisShow=ref(false);letmsg=ref('111');letbtn......
  • 鸿蒙基础篇-组件
    “在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。”各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今天的学习,鸿蒙基础篇-组件首先在鸿蒙开发中,组件(Comp......
  • 学习笔记(四):页面和自定义组件生命周期
    页面和组件的定义:自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的......
  • 如何将GB28181/GB35114流媒体监控视频汇聚平台LiveGBS中自带的redis组件换成自己的Red
    @目录1、Redis服务2、如何切换REDIS?2.1、停止启动REDIS2.2、配置信令服务2.3、配置流媒体服务2.4、启动3、搭建GB28181视频直播平台1、Redis服务在LivGBS中Redis作为数据交换、数据订阅、数据发布的高速缓存服务。默认LiveCMS解压目录下会携带一个REDIS服务。如果已经有自己的r......
  • 学习笔记(三):自定义组件
    自定义组件基于struct实现,1、struct:struct+自定义组件名+{...}的组合构成自定义组件,不能有继承关系。对于struct的实例化,可以省略new。2、@Component:@Component装饰器仅能装饰struct关键字声明的数据结构。struct被@Component装饰后具备组件化的能力,需要实现build方法描......
  • 【vue】15.组件通信的方式(一)props、emits、v-model
    Vue组件通信指的是在Vue.js应用程序中,不同组件之间传递数据和信息的过程。在一个项目中,通常有很多个组件,其中每个组件都是独立的实例,都拥有自己的状态和方法。因此,为了构建复杂的应用,组件之间需要能够互相传递数据和信息,也就是进行组件通信,接下来的几篇内容将对vue组件通信......
  • HarmonyOS:基于Web组件构建网络应用(2)
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18502207➤如果链接不是为敢技术的博客园地址,则可......
  • 060 单文件组件
    Vue的单文件组件用.vue结尾单文件组件的格式如下:别忘了template标签是不参与编译的,最后在页面上不显示School组件vue结构快捷键<vapp组件main.jsindex.html准备容器如果想在容器中什么都不写,调整main.js......