`
jiasongmao
  • 浏览: 648107 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

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

    博客分类:
  • WPF
阅读更多

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

说明说明

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

本主题包括下列各节。

概述

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

要求

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

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

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

创建一个示例应用程序

在此步骤中,您将准备要进行本地化的应用程序。 在 Windows Presentation Foundation (WPF) 示例中提供了一个 HelloApp 示例,它可用作本讨论中的代码示例。 如果想要使用此示例,请从 LocBaml Tool Sample (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 Tool Sample (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

    忽略

    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="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; // Application
      using System.Globalization; // CultureInfo
      using System.Threading; // Thread
      
      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;
              }
          }
      }
      
    使用 LocBaml 的一些提示

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

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

    • 本地化的资源 DLL 的版本必须与主程序集保持同步。

    接下来的内容

    现在,您应对如何使用 LocBaml 工具有了一个基本的了解。 您应该能创建包含 UID 的文件。 通过使用 LocBaml 工具,您应该能够分析文件以提取可本地化的内容;在内容翻译完成之后,应该能够生成 .resources.dll 文件以合并已翻译的内容。 本主题并未详尽涵盖所有内容,但是您应该通过它掌握了使用 LocBaml 对应用程序进行本地化所必需的知识。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics