如何:本地化应用程序

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

说明

LocBaml 工具不是适用于生产环境的应用程序。 它以示例形式呈现,该示例使用一些本地化 API,并说明了如何编写本地化工具。

概述

本文提供本地化应用程序的分步方法。 首先,准备您的应用程序,以便让需要翻译的文本可以被提取出来。 翻译文本后,将翻译后的文本合并到原始应用程序的新副本中。

创建示例应用程序

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

  1. 将应用程序开发到要开始本地化的位置。

  2. 在项目文件中指定开发语言,以便 MSBuild 生成主程序集和附属程序集(具有 .resources.dll 扩展名的文件)以包含中性语言资源。 HelloApp 示例中的项目文件是 HelloApp.csproj。 在该文件中,你将找到标识如下的开发语言:

    <UICulture>en-US</UICulture>

  3. 将 UIDs 添加到 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 {culture] 输出程序集的区域设置。
    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 HelloApp.resources.dll /out:Hello.csv

    说明

    如果输入文件 HelloApp.resources.dll不在与 LocBaml.exe 相同的目录中,请移动其中一个文件,以便这两个文件位于同一目录中。

  3. 运行 LocBaml 分析文件时,输出由逗号(.csv 文件)或选项卡(.txt 文件)分隔的七个字段组成。 下面显示了 HelloApp.resources.dll 的已分析的 .csv 文件:

    已分析的 .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 忽略 false false #Text1;#Text2
    HelloApp.g.en-US.resources:window1.baml Text1:System.Windows.Controls.TextBlock.$Content 没有 true true 世界您好
    HelloApp.g.en-US.resources:window1.baml Text2:System.Windows.Controls.TextBlock.$Content 没有 true true 再见世界

    请注意,注释 字段的所有值不包含任何值;如果字段没有值,则为空。 另请注意,第一行中的项既不可读也不可修改,并且具有“忽略”作为其 Category 值,所有这些都指示该值不可本地化。

  4. 为了便于发现已分析文件中的可本地化项,特别是在大型文件中,可以通过 类别可读性可修改性对项进行排序或筛选。 例如,可以筛选出不可读和不可修改的值。

翻译可本地化的内容

使用任何可用于翻译提取内容的工具。 执行此操作的一个好方法是将资源写入 .csv 文件并在 Excel Microsoft中查看它们,对最后一列(值)进行翻译更改。

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

通过使用 LocBaml 分析 HelloApp.resources.dll 而标识的内容已被翻译,且必须合并回原始应用程序。 使用 generate-g 选项生成新的 .resources.dll 文件。

  1. 使用以下语法生成新的 HelloApp.resources.dll 文件。 将区域性标记为 zh-CN (/cul:zh-CN)。

    LocBaml.exe /generate 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”和“再见世界”现在应在应用程序中翻译。

  4. 若要翻译到不同的区域性设置,请使用目标语言的区域设置。 下列示例演示了如何翻译为加拿大法语:

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

  5. 在主应用程序程序集所在的程序集,创建一个新的特定于区域性的文件夹,以容纳新的附属程序集。 对于法裔加拿大人,该文件夹将是 fr-CA。

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

  7. 若要测试新的附属程序集,你需要更改应用程序将在其下运行的区域性设置。 可通过以下两种方式之一执行此操作:

    • 更改操作系统的区域设置。

    • 在应用程序中,将以下代码添加到App.xaml.cs:

      <Application
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          x:Class="SDKSample.App"
          x:Uid="Application_1"
          StartupUri="Window1.xaml">
      </Application>
      
      using System.Windows;
      using System.Globalization;
      using System.Threading;
      
      namespace SDKSample
      {
          public partial class App : Application
          {
              public App()
              {
                  // Change culture under which this application runs
                  CultureInfo ci = new CultureInfo("fr-CA");
                  Thread.CurrentThread.CurrentCulture = ci;
                  Thread.CurrentThread.CurrentUICulture = ci;
              }
          }
      }
      
      
      Imports System.Windows
      Imports System.Globalization
      Imports System.Threading
      
      Namespace SDKSample
          Partial Public Class App
              Inherits Application
              Public Sub New()
                  ' Change culture under which this application runs
                  Dim ci As New CultureInfo("fr-CA")
                  Thread.CurrentThread.CurrentCulture = ci
                  Thread.CurrentThread.CurrentUICulture = ci
              End Sub
          End Class
      End Namespace
      

使用 LocBaml 的提示

  • 定义自定义控件的所有依赖程序集都必须复制到 LocBaml 的本地目录中或安装到 GAC 中。 这是必需的,因为本地化 API 在读取二进制 XAML (BAML) 时必须有权访问依赖程序集。

  • 如果主程序集已签名,则生成的资源 DLL 也必须进行签名才能加载它。

  • 本地化资源 DLL 的版本需要与主程序集同步。

另请参阅