
导言在WPF应用程序中搭建多语言支持(Multilingual Support)是我最近在做的一件事,对于不使用英语的人士而言,此举提高了程序的可用性。实现起来要完成以下目标: 一个版本容纳多种语言. 这就意味着不要创建单独的英语版本、法语版本、日语版本等等。 许多电子产品(例如电视和数码相机)在同一模块中支持多语言。你不需要购买不同模块或给软件打补丁来得到与默认设置不同的语言 允许在运行时切换接口语言. 这就是说不需要关闭应用程序并配置操作系统环境,一切都交给安装器。 首次运行选择合适语言. W应用程序第一次运行,就把接口语言设为操作系统的系统语言。这点很有意义--法国用户喜欢安装、运行、并马上使用软件,而不会再一个不熟悉的应用程序中找到切换语言的地方。 允许UI可拓展以便翻译,缩减可能的裁剪文本
此外,具体实现不应该随着用户界面的增长而越来越来难实现。(这是我觉得最困难的方面。) 所以这篇文章旨在提供一份我开发过程的详细解决方案的大纲,这基于一些我过去写过的博客和帖子(这里,这里和这里)。随着时间的推移,我将指出例子的相关部分并告诉你它们是如何适配在一起的。 声明:例子中的文本是使用自动在线翻译服务生成的。尽管尽了最大的努力来确保这是尽可能准确(通过反向翻译校对),有可能翻译的内容有不准确或错误。特别是当它使用了一个我不清楚的完全不同的写作系统。
上层概述这个为WPF应用所设计的实现遵循了一种MVVM(模型-视图-视图模型)样式。语言数据存储在嵌入式XML文件中,这些文件按照需求原则加载到内存中,即当接口语言发生改变的时候。这就是“模型”的部分。. “视图模型”具有将当前语言的语言数据包含到整个WPF应用中的特性。它是XAML文件的集合,XAML文件形成了包含了关联该语言数据的“视图”。为了给一个特定的文本元素选择准确的值,每个关联都利用具有一个转换器参数的用户定制值转化器来查找文本键值。最后,用一个用户定制标记扩展来抽取这个关联的细节,这样只有键值(即转换参数)需要指定。
例子为了说明这个实现在实际中如何工作,我根据这个功能创建一个小的示例应用。这个叫做'RePaver'的应用用于清除路径标记表达式,并具有基本的翻转,反转,转换和缩放实际几何图形(即无需图层转换)的功能。在后台,该应用用正则表达式抽取路径段落,并就地对每个段落进行转换。 为了给你有个概念,看如下一个Path表达式的例子,这个表达式一般从导出为XAML格式的矢量图形文件中得到(这个路径表达式跟一些我目前经手项目的路径没有关系!): <Path Data="M 470.567,400.914 L 470.578,
390.903 L466.551,390.863 L 472.6,384.876 L472.598,400.888 Z" ... /> 如果你复制黏贴(引号中的)数据表达式到输入框中并点击'Go',可以看到如下的输出: M 4,16 L 4,6 L 0,6 L 6,0 L 6,16 Z 在右边你还能即时看到形象化的"转换前"和"转换后"的结果。 你可以任意设置一些选项 - 可以看到这些操作是按照翻转/反转 -> 缩放到[根据边框尺寸] -> 偏移。当然,你可以用不同的语言试一下。
模块XML如上所述,每个组成用户界面的文本都保存在每种语言的XML文件的本地化表格中, 并把XML文件当做嵌入式资源来编译。每条text的父元素包含一个键属性用来检索本地化文本。下面是英语版本定义文件的例子,LangEN.xml: 03 | <MinFontSize> 11 </MinFontSize> |
04 | <HeadingFontSize> 16 </HeadingFontSize> |
07 | <Entry key= "TransformLabel" >Transform</Entry> |
08 | <Entry key= "LanguageLabel" >Language</Entry> |
10 | <!-- Common Operations --> |
11 | <Entry key= "ApplyLabel" >Apply</Entry> |
12 | <Entry key= "UndoLabel" >Undo</Entry> |
13 | <Entry key= "CancelLabel" >Cancel</Entry> |
15 | <!-- Section Headings --> |
16 | <Entry key= "InputLabel" >Input</Entry> |
17 | <Entry key= "OutputLabel" >Output</Entry> |
18 | <Entry key= "InfoLabel" >Info</Entry> |
19 | <Entry key= "TransformPropertiesLabel" >Transform</Entry> |
22 | <Entry key= "FlipRotateLabel" >Flip / Rotate</Entry> |
23 | <Entry key= "OffsetLabel" >Offset</Entry> |
24 | <Entry key= "ScaleToLabel" >Scale To</Entry> |
25 | <Entry key= "DimensionsLabel" >Dimensions</Entry> |
26 | <Entry key= "WidthLabel" >Width</Entry> |
27 | <Entry key= "HeightLabel" >Height</Entry> |
28 | <Entry key= "GoLabel" >Go</Entry> |
在上述英文版本示例中,同样提到了 theIsRtl, MinFontSize, 和HeadingFontSize元素。字体大小用来决定渲染字体的尺寸,让字体更易分辨,尤其在显示日文,韩文和阿拉伯文的时候。IsRtlel元素决定语言是否从右往左读(阿拉伯文和希伯来语就是这样)。
|