dotnetcore3.1 WPF 实现多语言

dotnetcore3.1 WPF 实现多语言

Intro

最近把 DbTool 从 WinForm 迁移到了 WPF,并更新到了 dotnet core 3.1,并实现了基于 Microsoft.Extensions.Localization 实现了基本的多语言支持。下面来分享一下如何来实现

服务注册

如果不熟悉如何在 WPF 中使用依赖注入,可以参考上一篇文章 dotnetcore3.1 WPF 中使用依赖注入

在应用启动前注册 Localization 服务,我这里使用的是自己自定义的基于 JSON 的多语言服务

services.AddJsonLocalization(options => options.ResourcesPathType = ResourcesPathType.CultureBased);

服务注册的最后使用了一个 ServiceLocator 模式的代码(DependencyResolver),保存了所有的注册服务,后面的 Localizer 扩展会用到

DependencyResolver.SetDependencyResolver(services);

代码文件实现方式

代码文件(如:MainWindow.xaml.cs) 中实现多语言较为简单,直接注入 IStringLocalizer 即可,获取对应的要实例化的,比如:

public partial class MainWindow: Window
{private readonly IStringLocalizer<MainWindow> _localizer;public MainWindow(IStringLocalizer<MainWindow> localizer){InitializeComponent();_localizer = localizer;}// ...{// ...MessageBox.Show(_localizer["Success"], _localizer["Tip"]);}
}

xaml 实现方式

LocaliazerExtension

xaml 文件中使用需要自定义一个扩展,定义如下,【实现源码】:

public class LocalizerExtension : MarkupExtension
{private readonly IStringLocalizerFactory _localizerFactory;public string Key { get; }public LocalizerExtension(string key){Key = key;_localizerFactory = DependencyResolver.Current.ResolveService<IStringLocalizerFactory>();}public override object ProvideValue(IServiceProvider serviceProvider){var targetRootType = serviceProvider.GetType().GetProperty("System.Xaml.IRootObjectProvider.RootObject", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(serviceProvider)?.GetType();if (null == targetRootType){targetRootType = typeof(MainWindow);}var localizer = _localizerFactory.Create(targetRootType);var value = localizer[Key];return (string)value;}
}

这里使用到了上面提到的 ServiceLocator 模式的代码,从 DependencyResolver 获取注册的服务,感觉这里的实现需要优化,有更好想法的小伙伴还望一起交流一下,另外如果你的应用比较简单,我觉得上面代码里的通过反射获取 targetRootType 的代码可以直接使用某一个类型例如:typeof(MainWindow) ,这样会更高效

在 xaml 中使用

  1. 在 Window 标签中添加扩展对应的命令空间,例如: xmlns:loc="clr-namespace:DbTool.Localization"

  2. 在需要实现多语言的地方引用,例如: <TextBlockMargin="0,0,4,0"Text="{loc:Localizer DbConnectionString}"></TextBlock>

  3. 在对应的资源文件中配置要使用多语言资源,如上面的 DbConnectionString

<Window x:Class="DbTool.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:loc="clr-namespace:DbTool.Localization"mc:Ignorable="d"Title="DbTool" Height="450" Width="800" FontSize="14"><Grid><TextBlock Margin="0,0,4,0" Text="{loc:Localizer DbConnectionString}"></TextBlock></Grid>
</Window>

语言切换

发生语言切换时或应用启动时设置默认语言时,要更新当前线程的 Culture 信息

// set current culture
var defaultCulture = "zh";
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(defaultCulture);
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(defaultCulture);

实现效果

More

这种方式的实现,目前还需要重启之后界面的语言才会发生变化,可以进一步优化,实现动态多语言,修改语言之后界面就切换,目前不是太需要,暂时没做,有需要的可以先自己研究一下。

Reference

  • https://github.com/WeihanLi/WeihanLi.Extensions.Localization.Json

  • https://github.com/WeihanLi/DbTool

  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/DbTool/MainWindow.xaml

  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/DbTool/MainWindow.xaml.cs

  • https://github.com/WeihanLi/DbTool/blob/wpf-dev/DbTool/Localization/LocalizerExtension.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卸载chrome_Chrome 浏览器必备“扩展管理工具”,一键管理 Chrome 扩展

前言丰富的扩展插件可以说是 Chrome 浏览器的灵魂了&#xff0c;但是扩展安装的多了&#xff0c;难免会引起卡顿&#xff0c;而且每次打开/关闭扩展都要进入扩展程序页面&#xff0c;切换起来很不方便。下面分享的三款 Chrome 扩展管理工具&#xff0c;可以让我们更便捷地管理 …

堆化 二叉堆一般用数组来表示。typedef struct _minHeapNodetypedef struct _otherInfo-icoding-C-数据结构

堆化 二叉堆一般用数组来表示。例如&#xff0c;根节点在数组中的位置是0&#xff0c;第n个位置的子节点分别在2n1和 2n2。 因此&#xff0c;第0个位置的子节点在1和2&#xff0c;1的子节点在3和4。以此类推。这种存储方式便于寻找父节点和子节点。 在二叉堆上可以进行插入节点…

POJ 3984 迷宫问题

定义一个二维数组&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&#xff0c;要…

面试官:你连HTTP请求Post和Get都不了解?

IT界知名的程序员曾说&#xff1a;对于那些月薪三万以下&#xff0c;自称IT工程师的码农们&#xff0c;其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居&#xff0c;但只是他们一厢情愿罢了。此话一出&#xff0c;不知激起了多少(码农)程序员的愤怒…

python升级pip在哪儿打开_Linux下升级python和安装pip的详解

Linux版本升级&#xff1a;1、首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致3、解压tar -zxvf Python-2.7.11.tgz进入Python-2.7.11目录 输入./configuremakemake install4、此时查看python版本还是系统默认的版本执行&#xff1a;mv /usr/bin/python …

[蓝桥杯2017决赛]图书排列-next_permutation枚举

题目描述 将编号为1~10的10本书排放在书架上&#xff0c;要求编号相邻的书不能放在相邻的位置。 请计算一共有多少种不同的排列方案。 输出 输出一个整数表示答案 代码如下: #include <iostream> #include <algorithm> using namespace std;int a[] {1, 2, 3, 4…

第一个一千行总结-数据结构C复习--知识点总结1--一到四章

总结 第一章: 数据结构包括:逻辑结构,储存结构, 运算集合 逻辑结构:分为线性(线性表, 栈, 队列, 字符串, 数组, 广义表) 非线性:树,图,网 储存结构:顺序储存和非顺序储存 线性储存,散列储存,链式储存 算法数据结构 程序 第二章:线性表: 线性表的线性储存 逻辑结构:…

运维进化论:微盟“删库跑路”给我们的启示

作者&#xff1a;茹炳晟&#xff0c;软件质量和研发工程效能专家事件背景微盟是国内移动互联网营销引领者&#xff0c;中国最大的微信公众智能服务平台&#xff0c;基于微信为企业提供开发、运营、培训、推广一体化解决方案&#xff0c;帮助企业实现线上线下互通&#xff0c;社…

[蓝桥杯2016决赛]阶乘位数-数论

题目描述 9的阶乘等于&#xff1a;362880 它的二进制表示为&#xff1a;1011000100110000000 这个数字共有19位。 请你计算&#xff0c;9999 的阶乘的二进制表示一共有多少位&#xff1f; 输出 输出一个整数表示答案 知识点: 整数m在k进制下&#xff0c;有多少位&#xff1f; …

拦截器如何获取@requestbody_分布式系统中如何优雅地追踪日志(原理篇)

分布式系统中日志追踪需要考虑的几个点&#xff1f;需要一个全服务唯一的id&#xff0c;即traceId&#xff0c;如何保证&#xff1f;traceId如何在服务间传递&#xff1f;traceId如何在服务内部传递&#xff1f;traceId如何在多线程中传递&#xff1f;我们一一来解答&#xff1…

数组合并假设有 n 个长度为 k 的已排好序(升序)的数组,请设计数据结构和算法,将这 n 个数组合并到一个数组,且各元素按升序排列。即实现函数-C-icoding-排序-数据结构

数组合并 假设有 n 个长度为 k 的已排好序&#xff08;升序&#xff09;的数组&#xff0c;请设计数据结构和算法&#xff0c; 将这 n 个数组合并到一个数组&#xff0c;且各元素按升序排列。即实现函数&#xff1a; void merge_arrays(const int* arr, int n, int k, int* out…

.NET Core开发实战(第11课:文件配置提供程序)--学习笔记

11 | 文件配置提供程序&#xff1a;自由选择配置的格式文件配置提供程序Microsoft.Extensions.Configuration.IniMicrosoft.Extensions.Configuration.JsonMicrosoft.Extensions.Configuration.NewtonsoftJsonMicrosoft.Extensions.Configuration.XmlMicrosoft.Extensions.Conf…

前端demo_【前端3分钟】Script Error产生的原因和解法

Script Error对于前端开发者相信都不陌生&#xff0c;而且由于没有具体错误堆栈和代码行列号&#xff0c;成为可能是最神秘的错误之一。下面介绍Script Error产生的原理和解决办法。1、Script Error是如何产生的跨域资源引用假如&#xff1a;abc.com 下的页面引用了属于 http:/…

第二个一千行总结-数据结构C复习--知识点总结2--五到七章

第五章 数组与广义表 n维数组看作数据元素为n-1维数组的线性表 数组地址计算:略 特殊矩阵压缩: 三角矩阵;三对角矩阵(带状矩阵); 稀疏矩阵:存储数据总量小于百分之三十 稀疏矩阵用三元组(行,列,值)储存,定义如下: typedef struct{ int row, col;//行,列 int e; }…

基于Abp VNext框架设计 - Masstransit分布式消息

abp 通过IDistributedEventBus接口集成自IEventBus实现分布式事件消息的发布订阅。IEventBus在什么时机触发PublishAsync?当前UnitOfWork完成时&#xff0c;触发IEventBus的PublishAsync在没有事务环境下&#xff0c;同步调用IEventBus的PublishAsyncabp 默认实现基于RabbitMq…

[蓝桥杯2018决赛]换零钞-枚举

题目描述 x星球的钞票的面额只有&#xff1a;100元&#xff0c;5元&#xff0c;2元&#xff0c;1元&#xff0c;共4种。 小明去x星旅游&#xff0c;他手里只有2张100元的x星币&#xff0c;太不方便&#xff0c;恰好路过x星银行就去换零钱。 小明有点强迫症&#xff0c;他坚持要…

16进制数用空格分开 tcp_面试时,你是否被问到过TCP/IP协议?

点击蓝字关注我们看到这句话&#xff0c;有没有感到很熟悉呀&#xff1f;相信很多人在面试的时候都被要求&#xff0c;很多人会觉得我们在实际开发中一般用不到这些知识&#xff0c;所以对这些东西不屑一顾。但是小编认为想要成为一个完美的网工,那么对这些基础知识必须要有一定…

直接使用汇编编写 .NET Standard 库

前言Common Language Runtime&#xff08;CLR&#xff09;是一个很强大的运行时&#xff0c;它接收 Common Intermediate Language&#xff08;CIL&#xff09; 的输入并最终产生机器代码并执行。CIL 在 CLR 上相当于 ASM 汇编代码的存在。CLR 之上的语言 C#、F#、VB.NET 等语言…

[蓝桥杯2016决赛]七星填数-next_permutation枚举

题目描述 如下图所示&#xff1a; 在七角星的14个节点上填入1~14 的数字&#xff0c;不重复&#xff0c;不遗漏。要求每条直线上的四个数字之和必须相等。 图中已经给出了3个数字。请计算其它位置要填充的数字&#xff0c;答案唯一。 填好后&#xff0c;请提交绿色节点的4个数…

python的argsort函数_python——argsort函数

numpy中argsort函数用法&#xff0c;有需要的朋友可以参考下。在Python中使用help帮助>>> import numpy>>> help(numpy.argsort)Help on function argsort in module numpy.core.fromnumeric:argsort(a, axis-1, kindquicksort, orderNone)Returns the indic…