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

WPF使用内置资源系统实现国际化

使用WPF内置资源系统实现国际化

1.创建资源字典文件

创建

在资源Resources文件夹下创建语言的资源字典文件

创建资源字典

编写语言内容

首先引入System命名空间,后续资源都是string类型

xmlns:sys="clr-namespace:System;assembly=mscorlib"

然后添加对应的字符串,key和对应的文本,在不同语言中Key需要一一对应,然后文本是不同语言的。

示例如下

中文Lang.zh-CN.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <sys:String x:Key="Title_MainWindow">主窗口</sys:String> <sys:String x:Key="Button_Save">保存</sys:String> <sys:String x:Key="Menu_File">文件</sys:String> <sys:String x:Key="Menu_Edit">编辑</sys:String> <sys:String x:Key="Button_CN">中文版</sys:String> <sys:String x:Key="Button_EN">英文版</sys:String> </ResourceDictionary>

英文 Lang.en-US.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <sys:String x:Key="Title_MainWindow">Main Window</sys:String> <sys:String x:Key="Button_Save">Save</sys:String> <sys:String x:Key="Menu_File">File</sys:String> <sys:String x:Key="Menu_Edit">Edit</sys:String> <sys:String x:Key="Button_CN">Chinese</sys:String> <sys:String x:Key="Button_EN">English</sys:String> </ResourceDictionary>

其他语言

按同样形式添加

2. 创建资源管理类

usingSystem.Globalization;usingSystem.Windows;usingSystem.Windows.Markup;publicstaticclassLanguageManager{privatestaticResourceDictionary?_currentResourceDictionary;publicstaticeventEventHandler?LanguageChanged;publicstaticCultureInfoCurrentCulture{get;privateset;}=CultureInfo.CurrentCulture;// 支持的语言列表publicstaticList<CultureInfo>SupportedLanguages{get;}=new(){newCultureInfo("en-US"),newCultureInfo("zh-CN"),newCultureInfo("ja-JP")};publicstaticvoidChangeLanguage(CultureInfoculture){if(culture==null)thrownewArgumentNullException(nameof(culture));CurrentCulture=culture;// 设置当前线程的UICultureThread.CurrentThread.CurrentUICulture=culture;Thread.CurrentThread.CurrentCulture=culture;// 加载对应的资源字典LoadResourceDictionary(culture.Name);LanguageChanged?.Invoke(null,EventArgs.Empty);}privatestaticvoidLoadResourceDictionary(stringlanguageCode){varapp=Application.Current;if(app==null)return;// 移除现有的语言资源if(_currentResourceDictionary!=null){app.Resources.MergedDictionaries.Remove(_currentResourceDictionary);}// 加载新的语言资源vardict=newResourceDictionary{Source=newUri($"/YourProjectName;component/Resources/Lang.{languageCode}.xaml",UriKind.RelativeOrAbsolute)};app.Resources.MergedDictionaries.Add(dict);_currentResourceDictionary=dict;}// 从资源文件中获取字符串(代码中使用)publicstaticstringGetString(stringkey){varvalue=Application.Current.TryFindResource(key);returnvalueasstring??$"#{key}#";}}

3. 在XAML中使用

之前直接写文本的地方都通过DynamicResource动态绑定资源名称

<Windowx:Class="WpfInternationalApp.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:local="clr-namespace:WpfInternationalApp"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="{DynamicResource Title_MainWindow}"Width="800"Height="450"mc:Ignorable="d"><Grid><ButtonWidth="97"Height="32"Margin="89,126,0,0"HorizontalAlignment="Left"VerticalAlignment="Top"Click="Button_Click"Content="{DynamicResource Button_EN}"/><ButtonWidth="97"Height="32"Margin="233,126,0,0"HorizontalAlignment="Left"VerticalAlignment="Top"Click="Button_Click_1"Content="{DynamicResource Button_CN}"/><ButtonWidth="109"Height="30"Margin="206,260,0,0"HorizontalAlignment="Left"VerticalAlignment="Top"Content="{DynamicResource Button_Save}"/></Grid></Window>

4. 初始化语言设置

方式一:在App.xaml中加载资源

<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionarySource="/Resources/Languages/Lang.zh-CN.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>

方式二:在App.xaml.cs中加载

protectedoverridevoidOnStartup(StartupEventArgse){base.OnStartup(e);// 设置框架级别的语言FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),newFrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));// 加载默认语言LanguageManager.ChangeLanguage(LanguageManager.SupportedLanguages[0]);}

5. 语言切换

直接使用ChangeLanguage方法切换即可

LanguageManager.ChangeLanguage(LanguageManager.SupportedLanguages[0]);LanguageManager.ChangeLanguage(LanguageManager.SupportedLanguages[1]);

6. 实现效果

中文版

英文版

http://www.jsqmd.com/news/818280/

相关文章:

  • 土工膜厂家推荐:恒全土工膜实力领航 - 17329971652
  • 3小时上线Claude智能体API服务:FastAPI 0.112+Pydantic v2.9+Claude-3.5-Sonnet生产就绪模板(附GitHub私有仓库直达链接)
  • 阀检有镜|碳硫有数,元素有据
  • 中小商家破局引流难题,AI 短剧营销系统低成本落地
  • 竹荪哪家口碑好:此山中野生菌优品佳誉 - 17322238651
  • 土工膜厂家哪家好:恒全土工膜品质出众 - 17322238651
  • 基于dq解耦的双向DC-AC逆变器有功无功功率控制
  • 【紧急预警】92%的AI Agent生产环境因UI层失控失败:3步检测+4种无障碍桥接方案(附微软/苹果官方Accessibility API调用基准测试数据)
  • Vue3+ElementPlus实战:从零构建高仿微信网页端聊天应用
  • 一文读懂欧盟 CRA 法案:核心内容与企业影响
  • PKSM终极指南:从Gen I到Gen VIII的宝可梦存档管理神器
  • 5X00225G01控制底座组件
  • C语言文件操作:文件读写、最佳实践、权限管理和安全策略
  • 土工膜厂家哪家靠谱:恒全土工膜诚信经营 - 13425704091
  • 在OpenClaw等Agent工具中无缝接入Taotoken服务实践
  • 【限时首发】Midjourney Wine印相Pro Pack:含27套NFT酒标纹理库+4K酒液动态渲染Lora模型(仅开放48小时下载)
  • 别再瞎勾选了!SuperMap iDesktop切MVT矢量瓦片时,‘分离数据与风格’到底怎么选?
  • NotebookLM接入YOLOv10后推理延迟骤降68%?深度剖析多模态上下文缓存机制
  • Arm PMU性能监控单元核心机制与PMCID1SR寄存器解析
  • 2026上海GEO优化哪家强?GEO优化技术深度解析:专业服务商的核心能力拆解 - 得赢
  • 近屿AI学:专升本转AI,一个月冲到11K
  • 20260514 之所思 - 人生如梦
  • 3分钟学会Zotero中文文献管理:茉莉花插件终极指南
  • 可拖入多个文件或文件夹 合并所有内容到一个txt,方便投喂给AI
  • Windows家庭版终极解决方案:RDP Wrapper免费开启远程桌面多用户功能
  • Ansible 如何配置 sudo 权限避免直接使用 root 账户?
  • 小微团队如何利用Taotoken统一管理多模型API成本
  • AntiDupl.NET:你的智能图片去重助手,快速清理重复照片的完整指南
  • 虚拟现实运动接口技术:导纳控制与步态算法解析
  • 在普宁做招牌找广告公司好还是自己找工厂好?|两种方式对比分析 - 掌上普宁品牌观察