如何对 WPF 项目进行全球化和本地化
介绍一种全局化和本地化 WPF 项目的方法,并提供一个示例
- 下载演示 - 26.79 KB
- 下载 LocalizationTest_code - 8.46 KB
- 下载 How_to_globalize_and_localize_a_WPF_project_Doc.zip - 99.42 KB
1. 概述
本文档介绍了一种在 Windows Presentation Foundation (WPF) 中进行全局化和本地化的方法,并提供了一个示例项目。本文档中提到的解决方案基于 Windows SDK 文档和“CodeProject.com”技术网站的一些示例项目。
全局化和本地化过程需要一些软件工具来协助。将使用以下工具:
< <MSBuild.exe (Microsoft 构建引擎)
< <LocBaml.exe
< <Resgen.exe (资源文件生成器)
< <Al.exe (程序集链接器)
<2. <全局化
代码隐藏中有两种字符串常量。一种是显示给用户需要本地化的,在本文档中称为“可本地化字符串”,另一种是仅用于代码而不需要本地化的,称为“不可本地化字符串”。
对于这两种字符串:
1. 使用一个类 NonLocalizableString.cs 来保存不可本地化字符串。
2. 使用 Properties\Resources.resx 来保存可本地化字符串。
<<!--[if mso & !supportInlineShapes & supportFields]>
全局化 是指设计和开发能够适应多种地点的应用程序。
用于全局化项目的工具(参见 4.2)
< <Microsoft 构建引擎 (Msbuild.exe),这是一个从命令行运行的编译器。
<1.1 < 全局化应用程序示例
本部分提供了一个全局化应用程序的示例,并给出了分步方法。
步骤 1。创建 WPF 应用程序
<!--[if gte vml 1]><
使用 Properties\Resources.resx 来保存可本地化字符串。
<!--[if gte vml 1]><
创建 NonLocalizableString.cs 来保存不可本地化字符串。
<!--[if gte vml 1]><
步骤 2。创建用户界面
<!--[if gte vml 1]><
步骤 3。创建“ShowMsg”按钮的响应函数
<!--[if gte vml 1]>
步骤 4。生成 XAML 中的 Uid
打开 Windows SDK 命令提示符
<!--[if gte vml 1]>
并使用以下命令生成 Uid 并进行检查:
Msbuild /t:updateuid LocalizationTest.csproj // 生成 Uid
Msbuild /t:checkuid LocalizationTest.csproj // 检查 Uid
XAML 中的结果如下所示:
<Grid x:Uid="Grid_1">
步骤 5。构建
构建完成后,全局化项目即可进行本地化。
待本地化的资源包含两部分:
<1. <XAML 中显示给用户的字符串
<2. <代码隐藏中显示给用户的字符串。
3. 本地化
本地化是指将应用程序资源翻译成应用程序支持的特定文化的本地化版本。
本部分将为您提供本地化应用程序的分步方法。
用于本地化的工具(参见 4.2)。
<1. <LocBaml.exe
<2. <Resgen.exe
<3. <Al.exe
本地化所需的核心文件
表 3-1 本地化核心文件
文件名 |
Location |
注释 |
LocalizationTest.exe |
bin\Release |
主程序集,用于从 XAML 中提取待本地化的资源。 |
LocalizationTest.g.resources |
obj\Release |
使用此文件生成 XAML 的二进制资源文件。 |
LocalizationTest.Properties.Resources.resources |
obj\Release |
使用其文件名格式重命名二进制资源文件。 |
Resources.resx |
Properties\ |
代码隐藏中的可本地化字符串 |
注释
1. 使用发布版本进行本地化。
2. 为简化说明,命令中不使用完整路径。
3.1 本地化代码隐藏中的资源
步骤 1: 复制一份 Properties\Resources.resx 并本地化相关字符串
资源文件:Resources.zh-cn.resx (文件名任意)
更新待本地化的资源:
<!--[if gte vml 1]>
<!--[if gte vml 1]>
步骤 2:使用 SDK 的 resgen.exe 生成二进制资源文件
Resgen Resources.zh-cn.resx
步骤 3:重命名步骤 2 生成的二进制资源文件
Resources.zh-cn.resources à LocalizationTest.resource.LocalizationTestResource.zh-cn.resources
3.2 本地化 XAML 中的资源
步骤 1:使用 LocBaml 从主程序集中提取待本地化的 XAML 资源。
LocBaml /parse LocalizationTest.exe
生成一个包含待本地化资源的 CSV 文件:LocalizationTest.CSV
注意:1. 请将 LocBaml 复制到主程序集所在的文件夹。
2. LocBaml 的输出文件名是可选的。
步骤 2:编辑 CSV 文件以本地化资源。请参见 4.4 获取 CSV 格式。
步骤 3:使用 LocBaml 使用 LocalizationTest.g.resources 和本地化的 CSV 文件生成二进制资源文件。
LocBaml /generate LocalizationTest.g.resources /tran: LocalizationTest.CSV /cul:zh-cn /out:.\zh-cn\
步骤 4:。重命名步骤 3 生成的二进制资源文件:
LocalizationTest.g.resources à LocalizationTest.g.zh-cn.resources
3.3 将两个二进制资源嵌入到卫星程序集中
使用 SDK 的“al.exe”工具并执行以下命令:
Al /template:LocalizationTest.exe /embed:LocalizationTest.Properties.Resources.zh-cn.resources /embed:LocalizationTest.g.zh-cn.resources /culture:zh-cn /out:LocalizationTest.resources.dll
创建一个“zh-cn”文件夹来保存“LocalizationTest.resources.dll”。
完成所有步骤后,zh-cn 的本地化版本就成功创建了。运行应用程序并进行检查。
<!--[if gte vml 1]>
4. 附录
4.1 材料链接
请通过以下链接了解 WPF 中全局化和本地化的概述:
ms-help://MS.MSSDK.1033/MS.NETFX30SDK.1033/wpf_conceptual/html/56e
请通过以下链接获取另一个示例代码。示例代码中有三种本地化 WPF .EXE 应用程序的方法。第三种方法是我们需要的方式,通过该方法可以在项目构建后进行本地化工作。
https://codeproject.org.cn/WPF/WPFUsingLocbaml.asp
您还可以通过以下链接获取有关如何使用 LocBaml 工具创建本地化应用程序的教程:
ms-help://MS.MSSDK.1033/MS.NETFX30SDK.1033/wpf_conceptual/html/5001227e-9326
4.2 工具
表 4-1 工具规范
工具 |
Specification |
MSBuild.exe |
Microsoft 构建引擎 (MSBuild) 是 Microsoft 和 Visual Studio 的新构建平台。MSBuild 在处理和构建软件方面完全透明,使开发人员能够在未安装 Visual Studio 的构建实验室环境中进行产品协调和构建。 |
LocBaml.exe |
LocBaml 工具不是生产就绪的应用程序。它被呈现为一个使用了一些本地化 API 的示例,并说明了如何编写本地化工具。 |
Resgen.exe 资源文件生成器 |
资源文件生成器将 .txt 文件和 .resx (XML 资源格式) 文件转换为公共语言运行时二进制 .resources 文件,这些文件可以嵌入到运行时二进制可执行文件中,或编译成卫星程序集。 |
Al.exe 程序集链接器 |
程序集链接器从一个或多个文件(这些文件是模块或资源文件)生成一个包含程序集清单的文件。 |
使用 LocBaml 的一些技巧
<1. <定义了自定义控件的所有依赖程序集必须复制到 LocBaml 的本地目录或安装到 GAC。这是必需的,因为本地化 API 在读取二进制 XAML (BAML) 时必须能够访问依赖程序集。
<2. <如果主程序集已签名,则生成的资源 DLL 也必须签名才能加载。
<3. <本地化资源 DLL 的版本需要与主程序集同步。
4.3 文件类型规范
表 4-2 文件类型规范
文件类型 |
Specification |
.resx |
基于 XML 的资源格式 |
.resources |
可以嵌入到运行时二进制可执行文件中,或编译成卫星程序集 |
4.4 LocBaml 生成的 CSV 文件中的列说明
表 4-3 LocBaml 生成的 CSV 文件中的列说明
Column |
描述 |
Baml 名称 |
标识 BAML 流;值将采用以下形式:AssemblyManifestStreamName:SubStream Name. |
资源键 |
标识可本地化资源;值将采用以下形式:Uid:Element Type.$Property. |
本地化类别 |
来自LocalizationCategory枚举的条目,指示这是什么类型的内容。 |
可读 |
指示资源是否可见以供翻译。 |
可修改 |
指示此值在翻译期间是否可以修改。 |
注释 |
本地化注释。 |
值 |
此资源的值。 |
4.4 WPF 全局化和本地化最佳实践
WPF UI 设计最佳实践
设计 WPF 应用程序时,请考虑实现以下最佳实践:
< <用 XAML 编写 UI;避免在代码中创建 UI。使用 XAML 创建 UI 时,会通过内置本地化 API 暴露它。
< <避免使用绝对位置和固定大小来布局内容;而是使用相对或自动大小调整。
1. 使用 SizeToContent;并将宽度和高度设置为 Auto
。
2. 避免使用 Canvas 来布局 UI。
3. 使用 Grid 及其大小共享功能。
< <在边距中提供额外空间,因为本地化文本通常需要更多空间。额外空间可以容纳可能的溢出字符。
< <在 TextBlock 上启用 TextWrapping 以避免剪切。
< <设置 xml:lang 属性。此属性描述特定元素及其子元素的文化。此属性的值会更改 WPF 中多个功能的行为。例如,它会更改连字符、拼写检查、数字替换、复杂脚本塑形和字体回退的行为。
<l <创建自定义复合字体以更好地控制用于不同语言的字体。默认情况下,WPF 使用 Windows\Fonts 目录中的 GlobalUserInterface.composite 字体。
< <创建可能被本地化为从右到左显示文本的文化的导航应用程序时,请显式设置每个页面的 FlowDirection,以确保页面不从 NavigationWindow 继承 FlowDirection。
< <创建托管在浏览器外部的独立导航应用程序时,请将初始应用程序的 StartupUri 设置为 NavigationWindow 而不是页面(例如,<Application StartupUri="NavigationWindow.xaml">
)。此设计使您能够更改窗口和导航栏的 FlowDirection。
WPF 本地化最佳实践
本地化 WPF 应用程序时,请考虑实现以下最佳实践:
< <使用本地化注释为本地化人员提供额外的上下文。
< <使用本地化属性来控制本地化,而不是选择性地省略元素上的 Uid 属性。有关更多信息,请参阅本地化属性和注释。
< <使用 msbuild /t:updateuid 和 /t:checkuid 来添加和检查 XAML 中的 Uid 属性。使用 Uid 属性来跟踪开发和本地化之间的更改。Uid 属性有助于本地化新的开发更改。如果手动为 UI 添加 Uid 属性,则该任务通常很繁琐且不准确。
1. 开始本地化后,请勿编辑或更改 Uid 属性。
2. 请勿使用重复的 Uid 属性(复制粘贴命令时请记住此提示)。
3. 在 AssemblyInfo.* 中设置 UltimateResourceFallback
位置,以指定正确的备用语言(例如,[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
)。
如果您决定通过省略项目文件中的 <UICulture> 标记来包含源语言,请将 UltimateResourceFallback
位置设置为主程序集而不是卫星程序集(例如,[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
)。