WPF 全球化
本主题介绍了编写面向全球市场的 Windows Presentation Foundation (WPF) 应用程序时应注意的问题。 System.Globalization 命名空间的 .NET 中定义了全球化编程元素。
XAML 全球化
Extensible Application Markup Language (XAML) 基于 XML,并利用在 XML 规范中定义的全球化支持。 以下各节介绍了一些应了解的 XML 功能。
字符引用
字符引用使用十进制或十六进制的形式指定其表示的特定 Unicode 字符的 UTF16 代码单元。 下例演示 COPTIC CAPITAL LETTER HORI 或“Ϩ”十进制字符引用:
Ϩ
下例演示十六进制字符引用。 请注意,十六进制数字的前面具有 x。
Ϩ
编码
XAML 支持的编码有 ASCII、Unicode UTF-16 和 UTF-8。 编码语句位于 XAML 文档的开头。 如果不存在编码特性,并且没有任何字节顺序,则分析器默认为 UTF-8。 UTF-8 和 UTF-16 都是首选编码。 不支持 UTF-7。 以下示例演示如何在 XAML 文件中指定 UTF-8 编码。
?xml encoding="UTF-8"?
语言特性
XAML 使用 xml:lang 来表示元素的语言特性。 若要使用 CultureInfo 类,语言特性值应为 CultureInfo 预定义的区域性名称之一。 xml:lang 在元素树中可继承(可按 XML 规则继承,但并不一定这样继承,因为存在依赖属性继承);在未明确赋值的情况下,其默认值为空字符串。
语言特性对指定区域方言非常有用。 例如,法语在法国、魁北克、比利时和瑞士的拼写、词汇和发音各不相同。 此外,中文、日语和朝鲜语虽然在 Unicode 中具有共同的码位,但表意文字字形不同,并使用完全不同的字体。
以下 Extensible Application Markup Language (XAML) 示例使用 fr-CA
语言特性指定加拿大法语。
<TextBlock xml:lang="fr-CA">Découvrir la France</TextBlock>
Unicode
XAML 支持所有 Unicode 功能,包括代理项。 只要能将字符集映射到 Unicode,就支持该字符集。 例如,GB18030 中引入了某些可映射到中文、日语和朝鲜语 (CFK) 扩展 A 和 B 以及代理项对的字符,因此完全受支持。 WPF 应用程序可使用 StringInfo 操作字符串,而无需知道其是否具有代理项对或组合字符。
使用 XAML 设计国际用户界面
本节说明编写应用程序时应考虑的用户界面 (UI) 功能。
国际化文本
WPF 包括用于所有 Microsoft .NET Framework 支持的书写系统的内置处理。
目前支持以下脚本:
阿拉伯语
孟加拉语
梵语
西里尔语
希腊语
古吉拉特语
果鲁穆奇语
希伯来语
表意文字脚本
卡纳达语
老挝语
拉丁语
马拉雅拉姆语
蒙古语
奥里亚语
叙利亚语
泰米尔语
泰卢固语
塔安那文
泰语*
藏语
*此版本支持显示和编辑泰语文本,但不支持断词。
目前不支持以下脚本:
高棉语
古朝鲜语
缅甸
僧伽罗语
所有书写系统引擎都支持 OpenType 字体。 OpenType 字体可包括 OpenType 布局表格,字体创建者通过此布局表格能够更好地设计国际化的高端版式字体。 OpenType 字体布局表格包含有关字形替换、字形位置、对齐方式、基线位置的信息,以便文本处理应用程序改进文本布局。
通过 OpenType 字体,可使用 Unicode 编码来处理大型字形集。 这种编码享有广泛的国际支持,并支持版式字形变体。
WPF 文本呈现使用 Microsoft ClearType 子像素技术,该技术支持分辨率独立性。 这极大地提高了可读性,并为所有脚本提供了支持高质量杂志样式文档的功能。
国际化布局
WPF 提供一种支持水平、双向和垂直布局的简便方式。 在呈现框架中,FlowDirection 属性可用于定义布局。 流方向模式包括:
LeftToRight - 适用于拉丁语和东亚语等语言的水平布局。
RightToLeft - 适用于阿拉伯语和希伯来语等语言的双向布局。
开发可本地化的应用程序
编写供全球使用的应用程序时,应牢记应用程序必须可本地化。 以下主题指出了若干注意事项。
多语言用户界面
多语言用户界面 (MUI) 是用于在 UI 中切换语言的 Microsoft 支持。 WPF 应用程序使用程序集模型来支持 MUI。 一个应用程序包含非特定语言程序集和与语言相关的附属资源程序集。 入口点是主程序集中的托管 .EXE。 WPF 资源加载程序采用 Framework 的资源管理器来支持资源查找和回退。 多个语言附属程序集使用同一个主程序集。 加载的资源程序集取决于当前线程的 CurrentUICulture。
可本地化的用户界面
WPF 应用程序使用 XAML 定义其 UI。 XAML 允许开发人员使用一组属性和逻辑指定对象的层次结构。 XAML 主要用于开发 WPF 应用程序,但也可用于指定任何公共语言运行时 (CLR) 对象的层次结构。 大多数开发人员使用 XAML 指定其应用程序的 UI,并使用 C# 等编程语言响应用户交互。
从资源方面来看,UI 属于资源元素范畴,因此,其最终分发格式必须可本地化,以支持国际语言。 由于 XAML 无法处理事件,因此,许多 XAML 应用程序都包含用于执行此操作的代码块。 有关详细信息,请参阅 WPF 中的 XAML。 将 XAML 文件标记为 XAML 的 BAML 形式时,会剥除代码并将其编译为不同的二进制文件。 BAML 形式的 XAML 文件、图像以及其他类型的托管资源对象将嵌入附属资源程序集中,该程序集可本地化为其他语言,如果不需要进行本地化,以上各项就会嵌入主程序集中。
注意
WPF 应用程序支持所有 FrameworkCLR 资源,包括字符串表、图像等。
生成可本地化的应用程序
本地化是指调整 UI 以适应不同的区域性。 若要使 WPF 应用程序可本地化,开发人员需要将所有可本地化的资源生成一个资源程序集。 该资源程序集本地化为不同语言,代码隐藏功能使用资源管理 API 进行加载。 WPF 应用程序所需的文件之一是项目文件 (.proj)。 应用程序中使用的所有资源都应包括在项目文件中。 以下 .csproj 文件示例演示如何执行此操作。
<Resource Include="data\picture1.jpg"/>
<EmbeddedResource Include="data\stringtable.en-US.restext"/>
若要在应用程序中使用资源,请实例化 ResourceManager 并加载要使用的资源。 下面的示例演示如何执行此操作。
void OnClick(object sender, RoutedEventArgs e)
{
ResourceManager rm = new ResourceManager ("MySampleApp.data.stringtable",
Assembly.GetExecutingAssembly());
Text1.Text = rm.GetString("Message");
}
在本地化的应用程序中使用 ClickOnce
ClickOnce 是 Visual Studio 2005 附带的新 Windows 窗体部署技术。 通过该技术可安装应用程序和升级 Web 应用程序。 对使用 ClickOnce 部署的应用程序进行本地化后,只能在本地化的区域性中查看该应用程序。 例如,如果将已部署的应用程序本地化为日语,则只能在日语版 Microsoft Windows 上查看该应用程序,而不能在英语版 Windows 上查看。 由于日语用户经常运行英语版本的 Windows,因此这常常会出现问题。
此问题的解决方案是设置非特定语言回退特性。 应用程序开发人员可选择从主程序集中删除资源,并指定可在特定区域性对应的附属程序集中找到该资源。 若要控制此过程,请使用 NeutralResourcesLanguageAttribute。 NeutralResourcesLanguageAttribute 类的构造函数包含两个签名,其中一个签名使用 UltimateResourceFallbackLocation 参数指定 ResourceManager 应在主程序集还是附属程序集中提取回退资源。 下面的示例演示如何使用 特性。 对于最终回退位置,该代码会导致 ResourceManager 在当前执行的程序集的目录的“de”子目录中查找资源。
[assembly: NeutralResourcesLanguageAttribute(
"de" , UltimateResourceFallbackLocation.Satellite)]