WPF应用程序支持多国语言解决方案
促使程序赢得更多客户的最好、最经济的方法是使之支持多国语言,而不是将潜在的客户群限制为全球近70亿人口中的一小部分。本文介绍四种实现WPF应用程序支持多国语言的解决方案。
效果如下图:
Language - en-US (英文)
Language - zh-CN (中文)
一、使用LocBaml工具
这是微软MSDN给出的一种解决方案,请参见如何:对应用程序进行本地化。这种方式操作相对繁琐,不能方便的实现在程序运行过程中动态切换语言,但是新增支持语言无需对项目重新编译,这是这种实现方式的一个亮点。
1. 设置默认语言环境
项目文件LocalizationDemo.csproj添加<UICulture>en-US</UICulture>,程序集文件AssemblyInfo.cs中把[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]注释去掉。
2. 在xaml文件中添加Uid
打开Visual Studio 命令提示(2010)如下图,进入项目文件.csproj所在目录,运行命令:msbuild /t:updateuid LocalizationDemo.csproj;若要验证是否缺少或重复Uid,运行命令:msbuild /t:checkuid LocalizationDemo.csproj。
3. 通过Localization.Attributes,设置本地化的特性(属性)
如:<DataGridTextColumn x:Uid="DataGridTextColumn_1" Header="No." Width="auto" Binding="{Binding No}" Localization.Attributes="$Content(Ignore) Width(Ignore) Header(None Readable Modifiable)"/>,这里Width(Ignore)设置Width属性不实现本地化,Header(None Readable Modifiable)设置Header属性可读可写需要实现本地化,更多本地化特性细节请参见本地化特性和注释。
4. 编译项目,生成语言资源文件
生成的LocalizationDemo.resources.dll会在binDebugen-US目录下。
5. 将语言资源文件输出存储为 .csv 文件,以作进一步分析
将 LocBaml.exe(LocBaml 工具是一种尚未投产使用的应用程序。它显示为一种示例,该示例使用某些本地化 API 并演示如何编写本地化工具。点击下载LocBaml)复制到应用程序的 bindebug 文件夹,即创建主应用程序集的位置。打开Visual Studio 命令提示(2010),进入bindebug目录,运行命令:LocBaml.exe /parse en-US/LocalizationDemo.resources.dll /out:en-US.csv
6. 翻译可本地化内容
注意此步应当使用兼容unicode的文本编辑器进行编辑翻译。或者中文系统下将 .csv 文件在 Microsoft Excel 中进行查看,对最后一列(值)进行翻译更改,另存为zh-CN.csv。
此时会弹出如下消息提示框,选择"是(Y)",
然后用记事本打开zh-CN.csv文件,选择"另存为",如下图(初始编码为"ANSI")选择"UTF-8"保存。
7. 使用 LocBaml 生成新增语言的.resources.dll资源文件
运行下面命令根据翻译的zh-CN.csv生成中文资源文件LocalizationDemo.resources.dll,可以在E:目录下找到,将生成的LocalizationDemo.resources.dll复制到项目binDebugzh-CN目录下即可。
LocBaml.exe /generate en-US/LocalizationDemo.resources.dll /trans:zh-CN.csv /out:E: /cul:zh-CN
8. 测试新增语言资源文件
更改操作系统的地区设置(“开始” | 控制面板 |“区域和语言选项”)。
代码中控制
1
2
3
4
|
//中文为: "zh-CN"
CultureInfo ci =
new
CultureInfo(
"en-US"
);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
|
二、使用资源字典文件
这种方式的实现相对较为丰富,即可实现新增支持语言无需重新编译,也可实现程序运行中切换语言(参见本文实现动态切换程序显示语言),以下是常用实现方式。
1. 创建资源字典StringResource.xaml,包含需要支持多国语言的字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<ResourceDictionary xmlns=
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys=
"clr-namespace:System;assembly=mscorlib"
>
<sys:String x:Key=
"WinTitle"
>MainWindow</sys:String>
<sys:String x:Key=
"TblText"
>Support multi language demo.</sys:String>
<sys:String x:Key=
"BtnOK"
>OK</sys:String>
<sys:String x:Key=
"HdNo"
>No.</sys:String>
<sys:String x:Key=
"HdName"
>Name</sys:String>
<sys:String x:Key=
"HdGender"
>Gender</sys:String>
<sys:String x:Key=
"HdDept"
>Dept</sys:String>
<sys:String x:Key=
"HdEmail"
>Email</sys:String>
<sys:String x:Key=
"HdTel"
>Tel</sys:String>
<sys:String x:Key=
"MsgShowTime"
>Now time
is
:{0}</sys:String>
</ResourceDictionary>
|
2. 在app.xaml中使用MergedDictionary
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<Application x:Class=
"LocalizationDemo.App"
StartupUri=
"MainWindow.xaml"
Exit=
"Application_Exit"
>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source=
"ResourcesStringResource.xaml"
/>
<ResourceDictionary Source=
"ResourcesStringResource.zh-CN.xaml"
/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
|
3. 在程序中使用资源字典中的字符串
-
.xaml文件,Text="{StaticResource TblText}"