Rinse and Repeat - 字体大小与流方向某些语言的字符集包含十分复杂的图形元素,以致在拉丁文可以辨认的字符大小,用来显示这些语言的时候,变得模糊不清了。你注意到CommonViewModel提供了HeadingFontSize和MinFontSize属性。这就为本地化标题和剩余的本地化文本相应地提供了字体大小。例如日文的字体大小就大于英文。 幸运的是,使用类似下面的这个模式就可以把上述的文字尺寸绑定到共享的样式中,而不需要值转换器:
下图显示的是两个同样界面不同语言下的差异: 也有一些语言是从右向左读的,例如阿拉伯语和希伯来语。为了让UI正确的定位到这些语言,反转接口是有意义的,否则会带来一些混淆,如果在使用程序的时候读取的顺序和逻辑的顺序不一致。 幸运的是,WPF有一个方便的属性可以完成反转整个UI的艰苦工作: FrameworkElement.FlowDirection 是什么让这个功能相当强大,我只需要绑定一个包含在主窗口内的根级别控件,因为这个值是由它下面的每个FrameworkElement的在视觉层次继承。绑定仅仅需要查看CommonViewModel的IsRightToLeft属性,转换到(通过其他的值转换器)FlowDirection的枚举值。自定义的标记扩展被创建,遵循以前类似的模板,简化为XAML:
鉴于到上述功能的强大,这里仍然要考虑一些陷阱和要点:
所以,下面就是赶时髦的“处理后”的截图: 注意路径,旋转选择控件,输入输出文本框是以从左至右的方式展示,这与语言无关。这是因为这些元素是特定的问题区域,如果它们以从右至左的方式展示,就没有道理了(可能会引起误解)。 总结现在明白了——一个局部的WPF应用程序可以在运行时动态地改变UI。第一次运行它是在法语的本地计算机环境中,瞧, il est affiché en Français. 它们都来自同一种语言版本。 最后一个要点需要注意,这里不做详细介绍,整个UI布局以流体方式布局,这样的布局会自动调整以适应内容。 而不是显式地设置宽度和高度, 网格的行/列定义,等等。这些都是“自动”为左的,同时还可以定义最小和最大值。这是很普通的实例中极佳的一个(而不是特定的本地化), 但当切换语言的时候,不允许这样的实例真的显示出来。 后记软件开发中本地化是一个热门的话题,理所当然,我也不是唯一一个写这方面的人。事实上,我也发现了一些人在做同样的事:
显然,实现WPF程序的本地化有很多种选择,它们并不互斥。根据你的权衡,我所提到的实现方法仅适用于你程序的部分,另一部分则会出现在其他的地方。所以你要根据你的需求,随意调整实现方法。 |