如何:对应用程序进行本地化

更新:2007 年 11 月

本教程演示如何使用 LocBaml 工具创建本地化的应用程序。

说明:

LocBaml 工具是一种尚未投产使用的应用程序。它显示为一种示例,该示例使用某些本地化 API 并演示如何编写本地化工具。

本主题包括下列各节。

  • 概述
  • 要求
  • 创建一个示例应用程序
  • 创建非特定语言资源附属程序集
  • 生成 LocBaml 工具
  • 使用 LocBaml 分析文件
  • 翻译可本地化的内容
  • 使用 LocBaml 生成新的 .resources.dll 文件
  • 使用 LocBaml 的一些提示
  • 接下来的内容
  • 相关主题

概述

本讨论提供用于本地化应用程序的详细步骤。首先,准备应用程序以便可以提取将要进行翻译的文本。在翻译文本之后,将已翻译的文本合并到原始应用程序的新副本中。

要求

在本文的讨论过程中,您将用到 Microsoft Build Engine (MSBuild),它是一种通过命令行运行的编译器。

此外,本文还会指导您使用项目文件。有关如何使用 MSBuild 和项目文件的说明,请参见生成和部署 Windows Presentation Foundation 应用程序

本讨论中的所有示例的区域性都使用 en-US(美国英语)。这样,无需安装其他语言,您就可以完成示例中的各个步骤。

创建一个示例应用程序

在此步骤中,您将准备要进行本地化的应用程序。在 Windows Presentation Foundation (WPF) 示例中提供了一个 HelloApp 示例,它可用作本讨论中的代码示例。如果想要使用此示例,请从 LocBaml 工具示例下载可扩展应用程序标记语言 (XAML) 文件。

  1. 将应用程序开发到要启动本地化的程度。

  2. 在项目文件中指定开发语言,以便 MSBuild 生成的主程序集和附属程序集(扩展名为 .resources.dll 的文件)可包含非特定语言资源。HelloApp 示例中的项目文件为 HelloApp.csproj。在该文件中,您将找到按如下方式进行标识的开发语言:

    <UICulture>en-US</UICulture>

  3. 将 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 进行本地化所必需的主应用程序集以及非特定语言资源附属程序集。生成应用程序:

  1. 对 HelloApp 进行编译以创建动态链接库 (DLL):

    msbuild helloapp.csproj

  2. 新创建的主应用程序集 HelloApp.exe 创建在下面的文件夹中:

    C:\HelloApp\Bin\Debug\

  3. 新创建的非特定语言资源附属程序集 HelloApp.resources.dll 创建在下面的文件夹中:

    C:\HelloApp\Bin\Debug\en-US\

生成 LocBaml 工具

  1. 生成 LocBaml 所必需的所有文件都在 WPF 示例中。请从 LocBaml 工具示例示例下载 C# 文件。

  2. 从命令行运行项目文件 (locbaml.csproj) 以生成工具:

    msbuild locbaml.csproj

  3. 转到 Bin\Release 目录查找新创建的可执行文件 (locbaml.exe)。例如:C:\LocBaml\Bin\Release\locbaml.exe。

  4. 在运行 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 以提取要进行本地化的文本内容。

  1. 将 LocBaml.exe 复制到应用程序的 bin\debug 文件夹,即创建主应用程序集的位置。

  2. 若要分析附属程序集文件并将输出存储为 .csv 文件,请使用下面的命令:

    LocBaml.exe /parse en-US/HelloApp.resources.dll /out:Hello.csv

    说明:

    如果输入文件 HelloApp.resources.dll 和 LocBaml.exe 不在同一个目录中,请移动其中一个文件使它们位于同一个目录下。

  3. 当您运行 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

    这七个字段是:

    1. BAML 名称。与源语言附属程序集相关的 BAML 资源的名称。

    2. 资源键。已本地化的资源标识符。

    3. 类别。值类型。请参见本地化属性和注释

    4. 可读性。本地化人员是否可以读取此值。请参见本地化属性和注释

    5. 可修改性。本地化人员是否可以修改此值。请参见本地化属性和注释

    6. 注释。有助于确定如何对值进行本地化的值的其他说明。请参见本地化属性和注释

    7. 。翻译为所需的区域性的文本值。

    下表显示这些字段如何映射到 .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”,这些都指示该值不能本地化。

  4. 为了便于在已分析的文件(尤其是大文件)中发现可本地化的项,您可以按照类别可读性可修改性对项进行排序或筛选。例如,您可以筛选掉不可读和不可修改的值。

翻译可本地化的内容

使用任何可用的工具来翻译提取的内容。其中的一个好方法就是:将资源编写为 .csv 文件并在 Microsoft Excel 中进行查看,对最后一列(值)进行翻译更改。

使用 LocBaml 生成新的 .resources.dll 文件

通过使用 LocBaml 分析 HelloApp.resources.dll 所标识的内容已进行了翻译,必须重新合并到原始应用程序中。使用 generate-g 选项生成新的 .resources.dll 文件。

  1. 使用下面的语法生成新的 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 不在同一目录中,请移动其中一个文件使它们位于同一个目录中。

  2. 将 C:\HelloApp\Bin\Debug\en-US\HelloApp.resources.dll 目录下旧的 HelloApp.resources.dll 文件替换为新创建的 HelloApp.resources.dll 文件。

  3. 现在,应该在应用程序中翻译“Hello World”和“Goodbye World”。

  4. 若要翻译为其他区域性,请使用要翻译成的语言的区域性。下面的示例演示如何翻译为加拿大法语:

    LocBaml.exe /generate en-US/HelloApp.resources.dll /trans:Hellofr-CA.csv /out:c:\ /cul:fr-CA

  5. 在主应用程序集所在的同一程序集中,创建一个新的特定于区域性的文件夹以放置新的附属程序集。对于加拿大法语,文件夹为 fr-CA。

  6. 将生成的附属程序集复制到新的文件夹中。

  7. 若要测试新的附属程序集,需要更改运行应用程序所用的区域性。可以通过两种方法执行此操作:

    • 更改操作系统的区域设置(“开始”|“控制面板”|“区域和语言选项”)。

    • 在您的应用程序中,将下面的代码添加到 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 对应用程序进行本地化所必需的知识。

请参见

概念

Windows Presentation Foundation 全球化

使用自动布局概述