前言
本人博客内容一般为记录工作或学习中遇到的问题,踩过的坑或者是常用的工具使用说明。记录是为了以后方便查找,内容可能存在瑕疵,请见谅。
内容
- 在WPF项目工程下,新建中文和英文的资源词典文件。不一定是根目录下,可以按照自己的开发习惯创建文件夹存放,只要清楚路径就好。
- 选择中文内容的资源词典,先引用String所在地程序集System
再根据自己实际需求编写键值,如图。(注意:英文的资源词典的key值一定要和中文的对应,这样才能通过Key值去绑定切换中英文)xmlns:s="clr-namespace:System;assembly=mscorlib"
- 将中文的资源词典添加到App.xaml.我这里是默认显示中文,所以添加中文,如果默认显示英文或则其他语言可以按需更改
- 将UI界面上所有需要切换显示中英文的内容,动态绑定资源词典的key值,如
<TextBlock x:Name="tb_CopyRight" Margin="20,0,0,5" Text="{DynamicResource 你的资源词典Key值}" Visibility="Visible" />
- 在把所有要切换的显示内容完成动态绑定后,可以尝试通过加载不同的资源词典用来调整界面显示。
- 应用内切换语言显示,只需将需要转变显示的资源词典替换掉当前的资源词典即可,界面因为是动态绑定,会即时切换,其代码示例如下
void RefreshLanguage() { string chineseLang = "zh-cn"; string englishLang = "en-us"; var currentLang = Application.Current.FindResource("Language").ToString(); if (currentLang == chineseLang) { if (ZGMessageBox.ShowQuestion("是否切换语言为英文?") == ZGDialogResult.Yes) { string english = "pack://application:,,,/Lang/Lang-en-us.xaml"; Application.Current.Resources.MergedDictionaries[2].Source = new Uri(english); Comm.IniHelper.SetAppConfigValueString(Comm.IniHelper.SysConfig, Comm.IniHelper.SysLanguage, ( (int)SysLanguage.English ).ToString()); ReFreshViewModel(); } } if (currentLang == englishLang) { if (ZGMessageBox.ShowQuestion("Whether to change the language to Chinese?") == ZGDialogResult.Yes) { string chinese = "pack://application:,,,/Lang/Lang-zh-cn.xaml"; Application.Current.Resources.MergedDictionaries[2].Source = new Uri(chinese); Comm.IniHelper.SetAppConfigValueString(Comm.IniHelper.SysConfig, Comm.IniHelper.SysLanguage, ( (int)SysLanguage.Chinese ).ToString()); ReFreshViewModel(); } } }
- 以上步骤就是完成WPF中英文切换的全部内容了。
建议
- 不管软件有无提资源本地化需求,建议都使用资源词典动态绑定,避免未来需求增加,工作量剧增
- 中译英,如果是自己机翻的话,可以使用AI将中文词典一次性翻译,贼快
- 设计界面采用了TextBlock,记得将TextWrapping 属性设置为wrap,避免内容过长被截断
- 设计界面尽量不要使用画布(Canvas)布局,因其采用坐标定位,通常更改起来牵一发动全身,十分耗费精力
- 如果是ViewModel需要通过绑定显示的内容,可以通过方法Application.Current.FindResource("Key值").ToString()实现动态绑定
- 如果动态绑定有Grid控件时,普通的Header动态绑定可能存在失效的情况,那是因为WPF的视觉树的原因,可以参考一下方法
<DataGridTextColumn Width="1.4*" Binding="{Binding LocationName}"> <DataGridTextColumn.HeaderTemplate> <DataTemplate> <TextBlock Text="{DynamicResource 名称}" /> </DataTemplate> </DataGridTextColumn.HeaderTemplate> </DataGridTextColumn>