LocBaml.exe是微软官方提供的一款WPF本土化的解决方案,这款工具可以帮助开发者将自己的产品进行经济而有效的本地化,支持多国语言,推荐有需要的用户下载使用。
当您将自己的产品限制为只能通过一种语言使用时,您便将潜在的客户群限制为全球 65 亿人口中的一小部分。 如果您想让自己的应用程序被全球用户所接受,那么对产品进行经济而有效的本地化将是赢得更多客户的最好、最经济的方法。
本概述介绍 Windows Presentation Foundation (WPF) 中的全球化和本地化。 全球化是指设计和开发在多个地点执行的应用程序。 例如,全球化支持适用于不同区域性用户的本地化用户界面和区域数据。 WPF 提供全球化设计功能,包括自动布局、附属程序集以及本地化特性和注释。
本地化是针对应用程序所支持的特定区域性将应用程序资源转换为本地化版本的过程。 在 WPF 中进行本地化时,可使用 System.Windows.Markup.Localizer 命名空间中的 API。这些 API 实现 LocBaml Tool Sample(LocBaml 工具示例)命令行工具。
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,在inDebugen-US目录下。
5. 将语言资源文件输出存储为 .csv 文件,以作进一步分析
将 LocBaml.exe 复制到应用程序的 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复制到项目inDebugzh-CN目录下即可。
LocBaml.exe /generate en-US/LocalizationDemo.resources.dll /trans:zh-CN.csv /out:E: /cul:zh-CN
8. 测试新增语言资源文件
更改操作系统的地区设置(“开始” | 控制面板 |“区域和语言选项”)。
代码中控制
//中文为: "zh-CN"CultureInfo ci = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;