如何:对应用程序进行本地化
更新:2007 年 11 月
本教程演示如何使用 LocBaml 工具创建本地化的应用程序。
说明: |
---|
LocBaml 工具是一种尚未投产使用的应用程序。它显示为一种示例,该示例使用某些本地化 API 并演示如何编写本地化工具。 本主题包括下列各节。
|
概述
本讨论提供用于本地化应用程序的详细步骤。首先,准备应用程序以便可以提取将要进行翻译的文本。在翻译文本之后,将已翻译的文本合并到原始应用程序的新副本中。
要求
在本文的讨论过程中,您将用到 Microsoft Build Engine (MSBuild),它是一种通过命令行运行的编译器。
此外,本文还会指导您使用项目文件。有关如何使用 MSBuild 和项目文件的说明,请参见生成和部署 Windows Presentation Foundation 应用程序。
本讨论中的所有示例的区域性都使用 en-US(美国英语)。这样,无需安装其他语言,您就可以完成示例中的各个步骤。
创建一个示例应用程序
在此步骤中,您将准备要进行本地化的应用程序。在 Windows Presentation Foundation (WPF) 示例中提供了一个 HelloApp 示例,它可用作本讨论中的代码示例。如果想要使用此示例,请从 LocBaml 工具示例下载可扩展应用程序标记语言 (XAML) 文件。
将应用程序开发到要启动本地化的程度。
在项目文件中指定开发语言,以便 MSBuild 生成的主程序集和附属程序集(扩展名为 .resources.dll 的文件)可包含非特定语言资源。HelloApp 示例中的项目文件为 HelloApp.csproj。在该文件中,您将找到按如下方式进行标识的开发语言:
<UICulture>en-US</UICulture>
将 UID 添加到您的 XAML 文件中。UID 用于跟踪对文件进行的更改和标识必须要进行翻译的项。若要将 UID 添加到您的文件中,请对项目文件运行 updateuid:
msbuild /t:updateuid helloapp.csproj
若要验证您没有缺少或重复的 UID,请运行 checkuid:
msbuild /t:checkuid helloapp.csproj
运行 updateuid 之后,您的文件应包含 UID。例如,在 HelloApp 的 Pane1.xaml 文件中,您应该能够找到下面的内容:
<StackPanel x:Uid="StackPanel_1">
<TextBlock x:Uid="TextBlock_1">Hello World</TextBlock>
<TextBlock x:Uid="TextBlock_2">Goodbye World</TextBlock>
</StackPanel>
创建非特定语言资源附属程序集
将应用程序配置为生成非特定语言资源附属程序集之后,便可生成应用程序。这将生成使用 LocBaml 进行本地化所必需的主应用程序集以及非特定语言资源附属程序集。生成应用程序:
对 HelloApp 进行编译以创建动态链接库 (DLL):
msbuild helloapp.csproj
新创建的主应用程序集 HelloApp.exe 创建在下面的文件夹中:
C:\HelloApp\Bin\Debug\
新创建的非特定语言资源附属程序集 HelloApp.resources.dll 创建在下面的文件夹中:
C:\HelloApp\Bin\Debug\en-US\
生成 LocBaml 工具
生成 LocBaml 所必需的所有文件都在 WPF 示例中。请从 LocBaml 工具示例示例下载 C# 文件。
从命令行运行项目文件 (locbaml.csproj) 以生成工具:
msbuild locbaml.csproj
转到 Bin\Release 目录查找新创建的可执行文件 (locbaml.exe)。例如:C:\LocBaml\Bin\Release\locbaml.exe。
在运行 LocBaml 时您可以指定的选项如下所示:
parse 或 -p:分析 Baml、资源或 DLL 文件以生成 .csv 或 .txt 文件。
generate 或 -g:通过使用已翻译的文件生成已本地化的二进制文件。
out 或 -o [文件目录]:输出文件名。
culture 或 -cul [区域性]:输出程序集的区域设置。
translation 或 -trans [translation.csv]:已翻译或已本地化的文件。
asmpath 或 -asmpath: [文件目录]:如果您的 XAML 代码包含自定义控件,则必须提供指向此自定义控件程序集的 asmpath。
nologo:显示没有徽标或版权信息。
verbose:显示详细模式信息。
说明: 如果您运行工具时需要上述选项的列表,请键入 LocBaml.exe 并按 Enter。
使用 LocBaml 分析文件
现在,您已创建了 LocBaml 工具,您就可以用它来分析 HelloApp.resources.dll 以提取要进行本地化的文本内容。
将 LocBaml.exe 复制到应用程序的 bin\debug 文件夹,即创建主应用程序集的位置。
若要分析附属程序集文件并将输出存储为 .csv 文件,请使用下面的命令:
LocBaml.exe /parse en-US/HelloApp.resources.dll /out:Hello.csv
说明: 如果输入文件 HelloApp.resources.dll 和 LocBaml.exe 不在同一个目录中,请移动其中一个文件使它们位于同一个目录下。
当您运行 LocBaml 来分析文件时,输出将由以逗号分隔(.csv 文件)或以制表符分隔(.txt 文件)的七个字段组成。下面演示对 HelloApp.resources.dll 进行分析的 .csv 文件:
HelloApp.g.en-US.resources:window1.baml,Stack1:System.Windows.Controls.StackPanel.$Content,Ignore,FALSE, FALSE,,#Text1;#Text2;
HelloApp.g.en-US.resources:window1.baml,Text1:System.Windows.Controls.TextBlock.$Content,None,TRUE, TRUE,,Hello World
HelloApp.g.en-US.resources:window1.baml,Text2:System.Windows.Controls.TextBlock.$Content,None,TRUE, TRUE,,Goodbye World
这七个字段是:
BAML 名称。与源语言附属程序集相关的 BAML 资源的名称。
资源键。已本地化的资源标识符。
类别。值类型。请参见本地化属性和注释。
可读性。本地化人员是否可以读取此值。请参见本地化属性和注释。
可修改性。本地化人员是否可以修改此值。请参见本地化属性和注释。
注释。有助于确定如何对值进行本地化的值的其他说明。请参见本地化属性和注释。
值。翻译为所需的区域性的文本值。
下表显示这些字段如何映射到 .csv 文件的分隔值:
BAML 名称
资源键
类别
可读性
可修改性
注释
值
HelloApp.g.en-US.resources:window1.baml
Stack1:System.Windows.Controls.StackPanel.$Content
Ignore
FALSE
FALSE
#Text1;#Text2
HelloApp.g.en-US.resources:window1.baml
Text1:System.Windows.Controls.TextBlock.$Content
无
TRUE
TRUE
Hello World
HelloApp.g.en-US.resources:window1.baml
Text2:System.Windows.Controls.TextBlock.$Content
无
TRUE
TRUE
Goodbye World
请注意,注释字段的所有值都不包含值;如果一个字段没有值,则为空。此外,还请注意,第一行中的项既不可读也不可修改,并且其类别值为“Ignore”,这些都指示该值不能本地化。
为了便于在已分析的文件(尤其是大文件)中发现可本地化的项,您可以按照类别、可读性和可修改性对项进行排序或筛选。例如,您可以筛选掉不可读和不可修改的值。
翻译可本地化的内容
使用任何可用的工具来翻译提取的内容。其中的一个好方法就是:将资源编写为 .csv 文件并在 Microsoft Excel 中进行查看,对最后一列(值)进行翻译更改。
使用 LocBaml 生成新的 .resources.dll 文件
通过使用 LocBaml 分析 HelloApp.resources.dll 所标识的内容已进行了翻译,必须重新合并到原始应用程序中。使用 generate 或 -g 选项生成新的 .resources.dll 文件。
使用下面的语法生成新的 HelloApp.resources.dll 文件。将区域性设为 en-US (/cul:en-US)。
LocBaml.exe /generate en-US/HelloApp.resources.dll /trans:Hello.csv /out:c:\ /cul:en-US
说明: 如果输入文件 Hello.csv 和可执行文件 LocBaml.exe 不在同一目录中,请移动其中一个文件使它们位于同一个目录中。
将 C:\HelloApp\Bin\Debug\en-US\HelloApp.resources.dll 目录下旧的 HelloApp.resources.dll 文件替换为新创建的 HelloApp.resources.dll 文件。
现在,应该在应用程序中翻译“Hello World”和“Goodbye World”。
若要翻译为其他区域性,请使用要翻译成的语言的区域性。下面的示例演示如何翻译为加拿大法语:
LocBaml.exe /generate en-US/HelloApp.resources.dll /trans:Hellofr-CA.csv /out:c:\ /cul:fr-CA
在主应用程序集所在的同一程序集中,创建一个新的特定于区域性的文件夹以放置新的附属程序集。对于加拿大法语,文件夹为 fr-CA。
将生成的附属程序集复制到新的文件夹中。
若要测试新的附属程序集,需要更改运行应用程序所用的区域性。可以通过两种方法执行此操作:
更改操作系统的区域设置(“开始”|“控制面板”|“区域和语言选项”)。
在您的应用程序中,将下面的代码添加到 App.xaml.cs:
<Application xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" x:Class="SDKSample.App" x:Uid="Application_1" StartupUri="Window1.xaml"> </Application>
使用 LocBaml 的一些提示
定义自定义控件的所有依赖程序集都必须复制到 LocBaml 的本地目录或安装到 GAC 中。这是必需的,因为当本地化 API 读取二进制 XAML (BAML) 时必须具有对依赖程序集的访问权限。
如果主程序集已签名,则生成的资源 DLL 也必须进行签名以便可以加载它。
本地化的资源 DLL 的版本必须与主程序集保持同步。
接下来的内容
现在,您应对如何使用 LocBaml 工具有了一个基本的了解。 您应该能创建包含 UID 的文件。通过使用 LocBaml 工具,您应该能够分析文件以提取可本地化的内容;在内容翻译完成之后,应该能够生成 .resources.dll 文件以合并已翻译的内容。本主题并未详尽涵盖所有内容,但是您应该通过它掌握了使用 LocBaml 对应用程序进行本地化所必需的知识。