下图显示“运行”对话框示例的输出。
英语:
.png)
德语:
.png)
设计一个全球化“运行”对话框
此示例使用 WPF 和 XAML 生成一个“运行”对话框。此对话框与 Microsoft Windows“开始”菜单中包含的“运行”对话框等效。
有关完整示例,请参见 全球化“运行”对话框示例。
生成全球化对话框的一些要点包括:
Automatic Layout
在 Window1.xaml 中:
<Window SizeToContent="WidthAndHeight">
以前的 Window 属性会根据内容的大小自动调整窗口的大小。此属性可以防止窗口切断在本地化之后增加大小的内容;它还可以在内容由于本地化而减小大小时移除不必要的空格。
<Grid x:Uid="Grid_1">
为了使 WPF 本地化 API 可以正确运行,需要使用 Uid 属性。
WPF 本地化 API 使用这些属性来跟踪 用户界面 (UI) 的开发和本地化之间的更改。使用 Uid 属性可以将较高版本的 UI 与较低版本的 UI 进行合并。通过在 Windows SDK 命令外壳程序中运行 msbuild /t:updateuid RunDialog.csproj 可以添加 Uid 属性。因为手动添加 Uid 属性通常比较费时并且准确性较差,所以建议使用此方法来添加这些属性。可以通过运行 msbuild /t:checkuid RunDialog.csproj 来检查是否正确设置了 Uid 属性。
使用 Grid 控件可以构造 UI,该控件对利用 WPF 中的自动布局很有用处。请注意,对话框被拆分成三行五列。没有一个行和列定义具有固定大小;因此,位于每个单元格中的 UI 元素能够在本地化过程中适应大小的增加和减小。
放置“Open:”(打开:)标签和 ComboBox 的前两列占用了 UI 的总宽度的 10%。
请注意,此示例使用了 Grid 的共享大小调整功能。最后三列通过将自身放置在相同的 SharedSizeGroup 中利用此功能。正如您可以从属性的名称中看出的那样,此属性使不同的列可以采用相同的大小。因此,在将“Browse…”本地化为更长的字符串“Durchsuchen…”时,所有按钮的宽度都会增加,而不是显示一个小的“OK”按钮和一个大得不相称的“Durchsuchen…”按钮。
Xml:lang
Xml:lang="en-US"
请注意放置在 UI 的根元素中的 XAML 中 xml:lang 的处理。此属性描述给定元素及其子元素的区域性。WPF 中的多项功能都使用此值,在本地化过程中应对此值进行相应的更改。此值会更改在断字以及对字词进行拼写检查时所使用的字典。它还会影响数字的显示以及字体回退系统选择所用字体的方式。最后,该属性会影响数值的显示方式以及用复杂字母书写的文本的造型方式。默认值为“en-US”。
Building a Satellite Resource Assembly
在 .csproj 中:
<UICulture>en-US</UICulture>
请注意,增加了 UICulture 属性。如果将此属性设置为有效的 CultureInfo 值(例如,“en-US”),生成项目时会产生一个包含所有可本地化的资源的附属程序集。
<Resource Include="RunIcon.JPG">
<Localizable>False</Localizable>
</Resource>
因为对于所有区域性 RunIcon.JPG 都应具有同样的外观,所以不需要对它进行本地化。Localizable 被设置为 False,以使其保留在非特定语言主程序集而不是附属程序集中。所有不可编译资源的 Localizable 的默认值都设置为 True。
对“运行”对话框进行本地化
Parse
生成应用程序之后,对其进行本地化的第一步是将可本地化的资源从附属程序集中分析出来。对于本主题而言,请使用 LocBaml 工具示例中包含的示例 LocBaml 工具。请注意,LocBaml 只是一个示例工具,其目的是帮助您了解有关如何生成适合您的本地化过程的本地化工具的入门知识。使用 LocBaml 可以运行下面的命令以进行分析:LocBaml /parse RunDialog.resources.dll /out:,从而生成“RunDialog.resources.dll.CSV”文件。
Localize
使用您所选的支持 Unicode 的 CSV 编辑器来编辑此文件。筛选掉本地化类别为“None”的所有项。您应看到下面的项:
资源键 | 本地化类别 | 值 |
Button_1:System.Windows.Controls.Button.$Content | 按钮 | OK |
Button_2:System.Windows.Controls.Button.$Content | 按钮 | Cancel |
Button_3:System.Windows.Controls.Button.$Content | 按钮 | Browse... |
ComboBox_1:System.Windows.Controls.ComboBox.$Content | 组合框 | |
TextBlock_1:System.Windows.Controls.TextBlock.$Content | 文本 | Type the name of a program, folder, document, or Internet resource, and Windows will open it for you. |
TextBlock_2:System.Windows.Controls.TextBlock.$Content | 文本 | Open: |
Window_1:System.Windows.Window.Title | 标题 | Run |
将该应用程序本地化为德语版本需要进行下面的翻译:
资源键 | 本地化类别 | 值 |
Button_1:System.Windows.Controls.Button.$Content | 按钮 | OK |
Button_2:System.Windows.Controls.Button.$Content | 按钮 | Abbrechen |
Button_3:System.Windows.Controls.Button.$Content | 按钮 | Durchsuchen… |
ComboBox_1:System.Windows.Controls.ComboBox.$Content | 组合框 | |
TextBlock_1:System.Windows.Controls.TextBlock.$Content | 文本 | Geben Sie den Namen eines Programms, Ordners, Dokuments oder einer Internetresource an. |
TextBlock_2:System.Windows.Controls.TextBlock.$Content | 文本 | Öffnen: |
Window_1:System.Windows.Window.Title | 标题 | Run |
Generate
本地化的最后一步涉及到创建新近本地化的附属程序集。可以使用下面的 LocBaml 命令完成此操作:
LocBaml.exe /generate RunDialog.resources.dll /trans:RunDialog.resources.dll.CSV /out: . /cul:de-DE
在德语版 Windows 上,如果此 resources.dll 被放置在主程序集旁边的“de-DE”文件夹中,则会自动加载此资源而不是“en-US”文件夹中的资源。如果您没有德语版的 Windows 来对此进行测试,请将区域性设置为您所使用的 Windows 的区域性(例如,en-US),并替换原始的 resources.dll。
Satellite Resource Loading
MyDialog.exe | en-US\MyDialog.resources.dll | de-DE\MyDialog.resources.dll |
|---|
代码 | 原始英语 BAML | 本地化 BAML |
非特定区域性资源 | 其他英语资源 | 其他被本地化到德语的资源 |
.NET Framework 根据应用程序的 Thread.CurrentThread.CurrentUICulture 自动选择要加载的附属资源程序集。其默认设置为您的 Windows 操作系统的区域性。因此,如果您使用的是德语版 Windows,则会加载 de-DE\MyDialog.resources.dll;如果您使用的是英语版 Windows,则会加载 en-US\MyDialog.resources.dll。通过在项目的 AssemblyInfo.* 中指定 NeutralResourcesLanguage,可以设置应用程序的最终回退资源。例如,如果您指定:
[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
则如果 de-DE\MyDialog.resources.dll 和 de\MyDialog.resources.dll 都不可用,则德语版 Windows 将使用 en-US\MyDialog.resources.dll。