代码改变世界

WPF 本地化(多语言)

2013-09-19 14:07 Andrew.Wangxu 阅读(...) 评论(...) 编辑 收藏

    如果你的程序需要本地化,考虑的因素诸多,例如:当文本改变后,控件的当前高度,宽度 是否合适。所在的位置是否合适、字体、布局是否合适?如果已经构建了一个真正自适应的布局,就不会有问题。用户界面应当能够调整自身以适应动态的内容。下面是建议采用的一些WPF设计原则:

  • 不要使用硬编码的宽度或高度
  • 将Window.SizeToContent 属性设置为Width、Height 或 WidthAndHeight,从而使窗口的尺寸能够根据需要进行变化(根据窗口结构的不同,并不总需要这样,但有时候会很有用)。
  • 使用 ScrollViewer 控件包装大量的文本

 

其他考虑事项:

  • 如果准备本地化应用程序的语言,其字符集区别很大,就需要使用不同的字体。可以通过在用户界面中本地化 FontFamily 属性完成该操作,或者可以使用混合字体,如 Global User Interface 字体、 Global Sans Serif 字体或 Global Serif 字体,这些字体支持所有语言。
  • 本地化是一个复杂的猪蹄。WPF 有一个可行的解决方案,但是还不是很完善。看完本篇博文之后,您可能希望看一看微软的 WPF 本地化白皮书,该白皮书有 66 页,可以从 http://wpflocalization.codeplex.com/ 获取该白皮书以及示例代码。另外期望微软在将来改善设计工具(如在Visual Studio 和 Expression Blend)对本地化的支持。

 

下面进入正题来实现本地化,其实操作起来并不是特别复杂,不要被本博文的大量细节描述所吓着了 O(∩_∩)O~~。操作一遍就会感觉不过如此了。

    第一步:需要为项目的 .csproj 文件,在第一个元素 <PropertyGroup> 中的任意一个地方,添加元素: <UICulture>en-US</UICulture>   (当然你也可以选择使用 zh-CN 中文作为默认文化)

    上面的标记是告诉编译器应用程序默认文化是 U.S.English (显然,可以选择其他适合的文化,正如上提到的 zh-CN)。一旦进行了这一修改,生成过程也会发生变化。在下一次编译应用程序时,最后会生成一个名为en-US的子文件夹。在该文件夹中包含的是一个附属程序集,该程序集包含了应用程序的所有编译过的 BAML 资源,以前这些资源保存在主应用程序的程序集中。

    简单解释下 ‘en-US’ ,从技术角度讲,不是针对特定语言本地化应用程序,而是针对文化,文化考虑了语言的地区变种。文化由使用连字符分割的两个标识符标识。第一部分标识语言,第二部分标识国家。因此 en-US 代表美国英语,zh-CN 代表中国汉语。有关文化名称及其包含两部分的标识符的完整列表,可以参考 Visual Studio 帮助文档中的 System.Globalization.CultureInfo 类。

    改好之后,生成程序是无法运行的。会报找不到 xxxx.xaml 的错误,因为你本机(如果你在中国)的默认语言是 zh-CN ,所以你需要在 App.xaml 中的代码部分加入以下代码进行测试即可成功运行起来:

    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
        }
    }

 

第二步:为本地化准备标记元素

    需要针对所有希望本地化的元素进行标记,添加专门的 Uid 特性。下面是一个标记例子:

<Button x:Uid="Button_1" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5" Padding="5">a button</Button>

    几乎都是需要标记的,手动去标记会消耗大量的时间和精力(根据你程序大小),幸运的是Visual Studio中包含了批量生成该Uid特性的工具,在开始菜单中可以找到,如下图所示:

选择 VS2012开发人员命令提示 即可。

在命令行中输入:msbuild /t:updateuid [你的.csproj文件路径] 

如图:

在VS中的所有元素的UID就都加好啦。

 

第三部:为了让翻译者可以顺利翻译并且不碰代码项目,我们需要生成一个.csv文件给翻译者进行内容翻译。

    这里我们需要用到 LocBaml 工具,目前,LocBaml 并不是已经编译过的工具。反而,可以作为示例从http://msdn.microsoft.com/zh-cn/library/ms746621.aspx 获取其源代码。必须手工对其进行编译后使用。(在本文中已经提供本地化示例下载 其中包含已经编译的 LocBaml 工具可直接使用)

    在DOS下使用 LocBaml 工具命令: locbaml /parse [你的资源文件路径]   (如: locbaml  /parse en-US\1024_LocalizableApplication.resources.dll )

如图:

    执行该命令后会在当前的目录生成一个包含细节内容的 .csv 文件,该文件可以拷贝给翻译者进行翻译。可以使用Excel、记事本程序进行打开,每行包含7个值:

  • BAML 资源的名
  • 元素的 Uid 和本地化的属性的名称
  • 本地化类别。该值来自 LocalizationCategory 枚举,用于帮助标识属性表示的内容的类型
  • 属性是否是可读的(实质上是指能否在用户界面上显示为文本)。所有可读的值总是需要被本地化,但不可读的值可能需要本地化,也可能不需要。
  • 属性值是否可以被翻译者修改。除非专门为其指定了其他值,该属性值总是为True。
  • 为翻译者提供的额外注释。如果没有提供注释,该值为空。
  • 属性值。这个是需要被本地化的细节。

 

第四步:拷贝.csv 文件给翻译者翻译之后

    我们将翻译完毕后的 .csv 文件将其编译进附属程序集,所以我们需要再一次使用 LocBaml 工具。指令如下(我这里以编译一份中文语言为例):

  1.     首先创建一个文件夹在Debug目录,文件夹名称为:zh-CN 
  2.     执行Locbaml指令:locbaml /generate en-US\1024_LocalizableApplication.resources.dll /trans:1024_LocalizableApplication.resources.zh-CN.CSV /cul:zh-CN /out:zh-CN

如图:

上面的指令执行以下操作:

  • 使用原来的附属程序集 en-US\1024_LocalizableApplication.resources.dll
  • 使用翻译过的 .csv 文件 1024_LocalizableApplication.resources.zh-CN.CSV
  • 使用中文语言文化
  • 输出到zh-CN目录

即可生成一个新的附属程序集文件:1024_LocalizableApplication.resources.dll

 

//需要调试不同的本地化只需要修改 Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); 这段代码中的 en-US 即可

其他注意事项:如果本地化其他语言进去之后,出现乱码,请把.csv 文件另存为utf-8文件后 在进行重新生成附属程序集文件(第四步操作)

至此,本地化已经结束·更多的细节请参考微软的本地化白皮书。

 

本文示例源码下载:http://files.cnblogs.com/andrew-blog/1024_LocalizableApplication.rar

开发工具:VS2012

参考:http://www.wxzzz.com/?id=136