WPF应用程序支持多国语言解决方案

来源:互联网 发布:小米6相机数据怎么清除 编辑:程序博客网 时间:2024/04/29 00:31

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:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     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 timeis:{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"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              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}"

转载地址:http://tech.ddvip.com/2012-10/1351006517184005.html