当前位置: 首页 > news >正文

WPF-实现多语言的静态(需重启)与动态切换(不用重启)

目录

一、多语言切换(需重启)

1、配置文件添加Key

2、新增附加属性当前选择语言

3、创建资源文件

 4、初始化多语言集合

5、切换多语言并更新配置文件

6、应用程序启动根据配置切换多语言

 7、使用

二、多语言切换(无需重启)

1、创建多语言标记扩展基类

2、添加资源转换器

3、创建资源文件

4、继承基类创建指定资源文件扩展

5、添加资源文件管理

6、切换语言

7、使用

8、后台使用多语言

①获取多语言资源字符串

②后台绑定


一、多语言切换(需重启)

1、配置文件添加Key

	<appSettings><add key="language" value="zh-CN"/></appSettings>

2、新增附加属性当前选择语言

        public CultureInfo SelectLanguage{get => (CultureInfo)GetValue(SelectLanguageProperty);set => SetValue(SelectLanguageProperty, value);}public static readonly DependencyProperty SelectLanguageProperty =DependencyProperty.Register("SelectLanguage", typeof(CultureInfo), typeof(MainWindow));

3、创建资源文件

 4、初始化多语言集合

        public ObservableCollection<CultureInfo> CultureInfos { get; private set; } = new ObservableCollection<CultureInfo>();private void Window_Loaded(object sender, RoutedEventArgs e){var dir =Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);var curs = CultureInfo.GetCultures(CultureTypes.AllCultures);foreach (CultureInfo cur in curs){if (string.IsNullOrWhiteSpace(cur.Name)) continue;string landir = Path.Combine(dir, cur.Name);if (Directory.Exists(landir)) CultureInfos.Add(cur);}if (CultureInfos.Any(cur => cur.Name.Equals("zh-CN", StringComparison.OrdinalIgnoreCase)) is false){var cur = curs.FirstOrDefault(c => c.Name.Equals("zh-CN", StringComparison.OrdinalIgnoreCase));if (cur != null) CultureInfos.Add(cur);}SelectLanguage = Thread.CurrentThread.CurrentCulture;}

5、切换多语言并更新配置文件

        protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e){base.OnPropertyChanged(e);if (e.Property == SelectLanguageProperty){if (SelectLanguage == Thread.CurrentThread.CurrentCulture) return;Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);if (ConfigurationManager.AppSettings["language"] is null)config.AppSettings.Settings.Add("language", SelectLanguage.Name);elseconfig.AppSettings.Settings["language"].Value = SelectLanguage.Name;config.Save();ConfigurationManager.RefreshSection("appSettings");}}

6、应用程序启动根据配置切换多语言

   /// <summary>/// App.xaml 的交互逻辑/// </summary>public partial class App : Application{protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);var lan= ConfigurationManager.AppSettings["language"];if (!string.IsNullOrWhiteSpace(lan)){CultureInfo culture = new CultureInfo(lan);Thread.CurrentThread.CurrentCulture = culture;Thread.CurrentThread.CurrentUICulture = culture;}}}

 7、使用

①映射命名空间

xmlns:rs="clr-namespace:WpfApp8.Resources"

②示例

    <Grid><GroupBox x:Name="gbox"><Grid><Button Width="100"Height="80"Background="LightGray"Content="{x:Static rs:SRS.TestLan}" /><ComboBox Width="150"Height="50"HorizontalAlignment="Left"VerticalContentAlignment="Center"DisplayMemberPath="NativeName"ItemsSource="{Binding Path=CultureInfos, ElementName=MW}"SelectedItem="{Binding Path=SelectLanguage, ElementName=MW}" /></Grid></GroupBox></Grid>

二、多语言切换(无需重启)

安装Nuget包:WpfExtensions.Xaml

1、创建多语言标记扩展基类

    /// <summary>/// 多语言绑定扩展基类 /// </summary>/// <typeparam name="T">多语言文件资源类</typeparam>[MarkupExtensionReturnType(typeof(object))]public class LanguageExtensionBase<T> : MarkupExtension where T : class{private static readonly ResourceConverter ResourceConverter = new ResourceConverter();[ConstructorArgument("Key")]public ComponentResourceKey Key { get; set; }public LanguageExtensionBase(string key){Key = new ComponentResourceKey(typeof(T), key);}public override object ProvideValue(IServiceProvider serviceProvider){if (Key == null){throw new NullReferenceException("Key cannot be null at the same time.");}IProvideValueTarget provideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;if (provideValueTarget == null){throw new ArgumentException("The serviceProvider must implement IProvideValueTarget interface.");}if (provideValueTarget.TargetObject?.GetType().FullName == "System.Windows.SharedDp"){return this;}return new Binding("Value"){Source = new I18nSource(Key, provideValueTarget.TargetObject),Mode = BindingMode.OneWay,Converter = ResourceConverter}.ProvideValue(serviceProvider);}}

2、添加资源转换器

    /// <summary>/// 资源转换器/// </summary>public class ResourceConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){Bitmap val = (Bitmap)((value is Bitmap) ? value : null);if (val == null){Icon val2 = (Icon)((value is Icon) ? value : null);if (val2 != null){return ToBitmapSource(val2.ToBitmap());}return value;}return ToBitmapSource(val);}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotSupportedException();}[DllImport("gdi32")]private static extern int DeleteObject(IntPtr o);public ImageSource ToBitmapSource(Bitmap bitmap){IntPtr ptr = bitmap.GetHbitmap(); //obtain the HbitmapBitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(ptr, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());DeleteObject(ptr); //release the HBitmapreturn bitmapSource;}}

3、创建资源文件

4、继承基类创建指定资源文件扩展

    /// <summary>/// 多语言绑定扩展/// </summary>[MarkupExtensionReturnType(typeof(object))]internal class LanguageExtension : LanguageExtensionBase<DefaultLanguage>{public LanguageExtension(string key) : base(key){}}

5、添加资源文件管理

try
{I18nManager.Instance.Add(Resource.ResourceManager);
}
catch (ArgumentException) 
{
}

6、切换语言

var culture = new CultureInfo("en-US");
I18nManager.Instance.CurrentUICulture = culture;
System.Threading.Thread.CurrentThread.CurrentCulture = culture;

7、使用

①映射命名空间到XAML

xmlns:Lan="clr-namespace:SqlSugarTest.Lan"

 ②资源文件中添加多语言资源

③示例

                    <GroupBox Header="多语言测试"><Menu Height="NaN" HorizontalAlignment="Center"VerticalAlignment="Center"Background="{x:Null}"FontSize="12" FontWeight="Bold"><MenuItem Margin="3" Padding="10,8"HorizontalAlignment="Center"HorizontalContentAlignment="Center"Header="{Lan:Language MultiLanguage}"><MenuItem Margin="3" Padding="10,5"Click="MenuItem_Click_CN" Header="CN-中" /><MenuItem Margin="3" Padding="10,5"Click="Button_Click_EN" Header="US-英" /><MenuItem Margin="3" Padding="10,5"Header="Test"><MenuItem Margin="3" Padding="10,5"Header="111" /><MenuItem Margin="3" Padding="10,5"Header="222" /></MenuItem></MenuItem></Menu></GroupBox>

8、后台使用多语言

①获取多语言资源字符串

        /// <summary>/// 获取Key资源/// </summary>/// <param name="key"></param>/// <param name="resource"></param>/// <returns></returns>public static string GetString(string key, ResourceManager resource = null){if (resource == null)return DefaultLanguage.ResourceManager.GetString(key, I18nManager.Instance.CurrentUICulture);elsereturn resource.GetString(key, I18nManager.Instance.CurrentUICulture);}
MessageBox.Show(GetString(nameof(DefaultLanguage.Test)));

②后台绑定

        static readonly ResourceConverter converter = new ResourceConverter();/// <summary>/// 按自定义数据绑定多语言/// </summary>/// <typeparam name="T">自定义数据源</typeparam>/// <param name="key">数据关键字</param>/// <returns></returns>public static BindingBase GetBinding<T>(string key, object element = null){var Key = new ComponentResourceKey(typeof(T), key);return new Binding("Value"){Source = new I18nSource(Key, element),Mode = BindingMode.OneWay,Converter = converter};}
 menu_Test.SetBinding(MenuItem.HeaderProperty, GetBinding<DefaultLanguage>(nameof(DefaultLanguage.Test)));

相关文章:

WPF-实现多语言的静态(需重启)与动态切换(不用重启)

目录 一、多语言切换&#xff08;需重启&#xff09; 1、配置文件添加Key 2、新增附加属性当前选择语言 3、创建资源文件 4、初始化多语言集合 5、切换多语言并更新配置文件 6、应用程序启动根据配置切换多语言 7、使用 二、多语言切换&#xff08;无需重启&#xff09;…...

UE5学习笔记12-为角色添加蹲下的动作

一、一点说明 1.蹲下使用了ACharacter类中Crouch();函数&#xff0c;函数功能是先检查是否存在运动组件&#xff0c;将bool类型的变量变为true&#xff0c;该变量代表是想要蹲下。 2.通过源码可知存在是否蹲下的bool变量bIsCrouched如图&#xff0c;如果对:1有疑问请搜索C位域 …...

【笔记】Android 多用户模式和用户类型

简介 用户界面&#xff1a;System 》Multiple Users 》 开关多用户模式。 一般是不同用户模式下&#xff0c;有修改Settings应用配置的权限差异&#xff0c;因此需要通过用户类型对功能进行判断限制。 代码 通过UserManager可以获取当前用户的信息。 frameworks/base/core/…...

SQL基础——MySQL的索引

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 一、概述 介绍 索引是通过某种算法&#xff0c;构建出一个数据模型&#xff0c;用于快速找出在某个列中有一特定值的行&#xff0c;不使用索引&#xff0c;MySQL必须从第一条记录开始读完整个表&…...

【开发语言】面向对象和面向过程开发思路的区别

引入&#xff1a; 我总结了 面向过程的开发语言思路&#xff1a;1.我要干啥&#xff1f;2.怎么才能实现 面向对象的开发语言思路&#xff1a;1.我要研究谁&#xff1f;2.他能干啥 详解&#xff1a; 面向过程的开发语言思路 我要干啥&#xff1f; 在面向过程的开发中&a…...

谷歌账号登录的时候提示被停用,原因是什么,账号还有救吗?该如何处理?

今日早上&#xff0c;有个久违的朋友找到我说&#xff0c;要恢复账号。 他的情况是这样的&#xff1a;7月21日的时候&#xff0c;他发现自己的谷歌账号登录的时候提示活动异常先&#xff0c;需要输入手机号码验证才能恢复账号。但是输入了自己和亲友们的多个手机号码都无法验证…...

数据库复习笔记

写在最前&#xff0c; 写文章的初衷只是为了复习与记录自己的成长&#xff0c;笔者目前水平还有待提高&#xff0c;文章中难免会出现许多问题与错误&#xff0c;文章内容仅供参考&#xff0c;有不足的地方还请大家多多包涵并指正&#xff0c;谢谢~ 第八章 T-SQL程序结构 8.…...

学习STM32(6)-- STM32单片机ADCDAC的应用

1 引 言 深入了解并掌握STM32F103单片机在模拟数字转换&#xff08;ADC&#xff09;和数字模拟转换&#xff08;DAC&#xff09;应用方面的功能和操作。学习如何配置STM32F103的ADC模块&#xff0c;实现模拟信号到数字信号的精确转换&#xff1b;同时&#xff0c;探索DAC模块…...

学习记录第二十五天

wait函数 wait函数是一个系统调用&#xff0c;用于等待一个子进程结束并回收其资源。当父进程调用wait函数时&#xff0c;它会暂停执行&#xff0c;直到至少有一个子进程结束。wait函数的原型如下&#xff1a; #include <sys/types.h> #include <sys/wait.h>pid_…...

C语言:字符串函数strcmp

该函数用于比较两个字符串是否一样。 使用方法如下&#xff1a; #include<stdio.h> #include<string.h>int main() {//strcmp函数返回值有三种情况&#xff0c;小于零时返回-1&#xff0c;等于零&#xff0c;大于零时返回1printf("%d\n", strcmp("…...

【数据分析---偏企业】 Excel操作

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Excel操作前 必看 Python 初阶 Python—语言基础与…...

Ajax-01.原生方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Ajax-原生方式</title> </head> <!-…...

OpenAI GPT-2 model use with TensorFlow JS

题意&#xff1a;使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景&#xff1a; Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本&#xff1f; If not what is the limitation, like mo…...

JVM-运行数据区(堆、栈、元空间)

文章声明&#xff1a;文章图片均来自互联网&#xff0c;因为本人画的图不够生动。 运行数据区是JVM最重要的一个区域。 运行数据区由栈、堆、元空间构成。 栈&#xff1a;程序计数器、JVM虚拟机栈&#xff0c;本地方法栈 本地方法栈&#xff1a;加载native修饰的方法&#…...

超详细!!! LVS(Linux virual server)负载均衡知识及其NAT模式、DR模式、火墙标记实验

目录 前言系统性能扩展方式集群Cluster分布式集群与分布式 四层转发与七层转发的区别 LVS&#xff08;Linux virual server&#xff09;一、LVS介绍LVS相关概念 二、LVS集群结构体系1. 负载均衡层&#xff08;Load Balancer&#xff09;2. 服务器群组层&#xff08;Server Pool…...

信息学奥赛一本通1259:【例9.3】求最长不下降序列

题目&#xff1a; 1259&#xff1a;【例9.3】求最长不下降序列 时间限制: 1000 ms 内存限制: 65536 KB 提交数:51218 通过数: 20928 Special Judge 【题目描述】 设有由n(1≤n≤200)n(1≤n≤200)个不相同的整数组成的数列&#xff0c;记为:b(1)、b(2)、……、…...

星露谷模组开发教程#3 事件

首发于Enaium的个人博客 SMAPI提供了一些事件&#xff0c;比如游戏的内容、显示、输入等事件。这些事件可以让我们在游戏中添加自己的逻辑。这一节我们就来看看如何使用这些事件。 注册一个事件 在SMAPI中&#xff0c;我们可以通过IModHelper的Events属性来注册事件。比如我们…...

C语言程序设计(初识C语言后部分)

愿天下无Bug&#xff0c;秀发常驻。 3&#xff09;函数的参数 1.实际参数&#xff08;实参&#xff09;&#xff1a; 真实传给函数的参数&#xff0c;叫实参。 实参可以是&#xff1a;常量、变量、表达式、函数等。 无论实参是何类型的量&#xff0c;在进行函数调用时&#…...

驱动基础开发

1、字符设备传统开发模板 字符设备驱动框架&#xff0c;首先我们需要去用module_init这个宏去修饰整个驱动的入口函数&#xff0c;用module_exit去修饰整个驱动的出口函数&#xff0c;然后还需要用MODULE_LICENSE用于声明模块的许可证类型。 在入口函数里面我们需要注册字符设…...

从苹果AppStore看AI开发者生态

从苹果 App Store 看 AI 开发者生态 在人工智能迅速发展的今天&#xff0c;我们不禁要问&#xff1a;未来的 AI 开发者生态将会是什么样子&#xff1f;为了回答这个问题&#xff0c;我们不妨回顾一下移动互联网时代最成功的开发者生态之一——苹果的 App Store。 通过分析 App …...

【Python学习-UI界面】PyQt5 小部件1-Label

QLabel 对象可用作显示不可编辑的文本、图像或动态GIF影片的占位符。 它还可以用作其他小部件的助记键。 标签可以显示普通文本、超链接或富文本。 1、普通文本 直接双击输入即可 2、添加超链接 选中对应Label&#xff0c;右键选择多信息文本&#xff0c;添加链接&#xff0c…...

【Linux详解】进度条实现 Linux下git 的远程上传

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; &#x1f680;前言 &#x…...

Android进阶之路 - res、raw、assets 资源解析、区别对比

那天遇到一个资源目录层级的问题&#xff0c;索性重新整理记录一下&#xff0c;希望能帮到如吾往昔之少年的你们&#xff0c;哈哈哈哈哈哈… 一脸茫然&#xff0c;越写越多&#xff0c;时间成本属实有点大&#xff0c;就当一起来基础扫盲吧 resdrawablemipmapvaluescolor asset…...

从数字化到数智化:消费零售企业如何实现门店数智化管理?

随着信息技术的飞速发展&#xff0c;数字化已成为企业转型的必经之路。然而&#xff0c;数字化本身并不是目的&#xff0c;而是通往数智化的桥梁。数智化&#xff0c;即数据智能化&#xff0c;是指企业通过数字化手段收集和分析数据&#xff0c;进而利用这些数据驱动决策和创新…...

Linux中ES的安装

文章目录 一、ES是什么1.1、ES概念介绍1.2、技术架构1.2.1、Lucene介绍 1.3、ES的工作原理1.4、ES的适用场景 二、安装前的配置2.1、创建普通用户2.2、调整文件描述符数量和虚拟内存2.3、设置shell会话的资源限制&#xff08;软限制和硬限制&#xff09;2.4、增加虚拟内存的设置…...

Redis远程字典服务器(5) —— hash类型详解

目录 一&#xff0c;hash基本情况 二&#xff0c;hash常用命令详解 2.1 hset&#xff0c;hget&#xff0c;hexists&#xff0c;hdel 2.2 hexists&#xff0c;hdel 2.3 hkeys&#xff0c;hvals 2.4 hgetall&#xff0c;hmget 2.5 hlen&#xff0c;hsetnx 2.6 hincrby&am…...

MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁

1、InnoDB中的行锁 行锁&#xff08;Row Lock&#xff09; 也称为记录锁&#xff0c;顾名思义&#xff0c;就是锁住某一行&#xff08;某条记录row&#xff09;。需要注意的是&#xff0c;MySQL服务器层并没有实现行锁机制&#xff0c;行级锁只在存储引擎层实现。 优点&#x…...

【网络编程】TCP通信基础模型实现

tcpSer.c #include <myhead.h> #define SER_IP "192.168.119.143" // 设置IP地址 #define SER_PORT 6666 // 设置端口号 int main(int argc, const char *argv[]) {// 1.创建socketint serfd socket(AF_INET, SOCK_STREAM, 0);// 参数1表示ipv4// 参数2表…...

css rem之2024

话题开始前 我们都知道1rem是等于html fontSize标签的字体大小的&#xff0c;我们主要用来做移动端网页设计稿等比例在手机上面的显示。 看到的问题 这个html fontsize的大小是通过js动态计算的&#xff0c;而这个js的运行时晚于html渲染的&#xff0c;所以会导致一个问题&am…...

python自动化笔记:pytest框架

目录 一、pytest介绍二、测试用例命名规则2.1、pytest命名规则2.2、python命名规范 三、pytest运行方式3.1、主函数方式3.2、命令行方式3.3、通过pytest.ini的配置文件运行&#xff08;常用&#xff09; 四、跳过测试用例4.1 无条件跳过4.2 有条件跳过 五、用例的前后置&#x…...

合肥网站建设需要多/武威网站seo

《UltraSR Spatial Encoding is a Missing Key for Implicit Image Function-based Arbitrary-Scale Super-Resolution》&#xff08;说明&#xff1a;如果您认为下面的文章对您有帮助&#xff0c;请您花费一秒时间点击一下最底部的广告以此来激励本人创作&#xff0c;谢谢!!!&…...

徐州有哪些制作网站的公司/seo流量排名工具

Jquery Mobile中pageinit等函数执行两次的问题【终极解决】参考文章&#xff1a; &#xff08;1&#xff09;Jquery Mobile中pageinit等函数执行两次的问题【终极解决】 &#xff08;2&#xff09;https://www.cnblogs.com/langu/p/3914987.html 备忘一下。...

义乌做网站/重庆网站关键词排名优化

椒盐噪声 椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效…...

知名网站建设公/seo人才招聘

作者踩了各个大坑&#xff0c;得此精华 注意点1&#xff1a;安装Pycharm 安装Pycharm应当勾选添加路径选项。 以免最后需要手动添加环境变量。 注意点2:安装python 需要安装python3.6~3.9&#xff0c;3.6或3.10不行。 高版本或低版本无法匹配PyQt5。 注意点3:新建一个proj…...

自己做网站要买服务器吗/seo哪家强

编写帮助文档除了内容之外&#xff0c;如何呈现给用户也很重要&#xff0c;专业的形象有助于帮助用户更快的上手使用&#xff0c;并且建立专业形象&#xff0c;可能你的帮助文档内容来源各个地方&#xff0c;但最终&#xff0c;每个知识库都需要自己的样式指南&#xff0c;你可…...

共青团智慧团建登录网站/苏州网站排名推广

极市平台&#xff08;微信公众号ID&#xff1a;extrememart&#xff09;&#xff1a;专注计算机视觉前沿资讯和技术干货。本文由极市平台首发&#xff0c;转载需获授权。极市导读&#xff1a;今天给大家推荐一篇CVPR2020上对通道注意力进行改进的文章---ECANet&#xff0c;ECAN…...