XML 的主要优势之一是其对国际化的支持。它的核心字符集 Unicode 提供了机制来支持更具地区普及性的系统 ― 如欧洲的 ISO-8859 变体、日本的 Shift-JIS 或中国的 BIG-5。这很好。在最初以狭隘的地域观点开发了应用程序后,为了进行国际化部署,人们不得不投入大量财力来改写它们。然而,对于国际化来说,所需的工作远比对国际化字符集的支持要多。能够根据一组特定的语言和文化习惯来定制表示信息的方法,这也很重要。这就是所谓的 本地化。
一般的本地化从数据格式本身(这正是使用 XML 的便利之处)来讲,本地化的某些方面(如日期格式和姓名次序)可以用基本的 XML 功能加以解决。一种方法是使用国际标准形式;一个很不错的示例是日期,对日期最好是使用 ISO 8601 标准(请参阅 )。 有一个示例:
清单 1. 地区(美国)日期及其本地化后的日期1
2
3
4
5
6
7
| <?xml version="1.0" encoding="utf-8"?>
<products>
<!-- US-specific date -->
<product release-date="8/18/2002"/>
<!-- ISO-8601 date -->
<product release-date="2002-08-18"/>
</products>
|
ISO-8601 日期的一个优势在于:通常可以在大多数编程语言中将它们作为简单的字符串进行比较,这和大多数本地化的日期不同。例如,在大多数编程系统中,字符串“8/19/2001”比“8/18/2002”大,即使实际上前面的日期早于后面的。采用 ISO-8601 格式的同等比较 ― “2001-08-19”与“2002-08-18”比较 ― 则显示了字符串形式与实际日期比较之间更自然的对应。本地化的软件可以先使用 ISO-8601 日期,然后以适当的本地化形式实际显示适合人们使用的字段。大多数编程语言(包括流行的 XSLT 的 EXSLT 扩展库)都很容易支持这种转换。
另一个本地化方法是精心地构造数据,以便在本地以适当的方式重新构造它。姓名就是一个的好例子:在某些文化(如中文)中,姓通常在名的前面。 显示了为更好地支持这样的本地习惯所构造的一个数据示例。
清单 2. 用于本地化的结构化姓名格式的示例1
2
3
4
5
6
7
8
9
10
11
| <?xml version="1.0" encoding="utf-8"?>
<signatories>
<!-- The direct approach. -->
<name>Mr. Uche Ogbuji</name>
<!-- Structure to support local conventions -->
<name>
<honorific>Mr.</honorific>
<given>Uche</given>
<family>Ogbuji</family>
</name>
</signatories>
|
如果采用直接的方法,读者可能会试图按习惯推断姓名的各个部分,但这常常是有风险的。如果姓名的某些部分(如敬语)被省略,那该怎么办?那时您能猜出姓名用的是什么次序吗?采用第二种方法,您可以根据本地习惯,把显示给读者的姓名重新格式化。事实上,如果给出了每一项在可能的先后次序方面的某种提示(如国籍),那么可以为每个姓名定制姓名的次序。第二种方法显然增加了一些复杂性和开销,但是,在选择各种级别的标记结构以便支持多种习惯时,始终要在实用性与灵活性之间加以权衡。
行内翻译另一个常见的本地化问题是如何表示标号、消息、描述以及类似事物的翻译。XML 1.0 提供了在元素内容和属性值中使用的语言规范。您可以为每个元素设置语言。 是同时具有英语和西班牙语元素的 XML 文档示例。
清单 3. 其元素具有本地化语言形式的 XML 文档。1
2
3
4
5
6
7
| <?xml version="1.0" encoding="utf-8"?>
<menu>
<item id="A" xml:lang="en">Orange juice</item>
<item id="A" xml:lang="es">Jugo de naranja</item>
<item id="B" xml:lang="en">Toast</item>
<item id="B" xml:lang="es">Pan tostada</item>
</menu>
|
xml:lang 属性可以具有 RFC 1766 允许的任何值。这意味着可以使用一些值来代表主要的语言指称(如 en 代表英语, es 代表西班牙语等等)。如果某种语言有多种变体,通过添加流行使用某种变体的区域代号(如 en-US 代表美式英语、 en-GB 代表英式英语,或者 es-MX 代表墨西哥西班牙语),您可以更明确地进行定义。请注意,不需要在这里声明名称空间: xml 名称空间已经隐式地定义在每一个文档中。还要注意,语言指称影响相关元素的所有子元素,以及所有其它的子内容。而且,虽然在 XML 规范中特别提到了 xml:lang 属性,您仍必须在模式中提供它。 中的 DTD 片段说明了这一点:
清单 4. 支持 xml:lang 的 DTD1
| <!ATTLIST item xml:lang NMTOKEN #IMPLIED "en">
|
该声明添加了对该属性的支持,并设置了缺省值 en ,以免该属性被忽略。请注意,我没有添加对 id 属性的声明,通常是需要它的。
结束语本地化所需要做的工作远不止本文所介绍的。对开发人员而言,通常这更多的是一种通用思想而不是一套一成不变的规则。您必须不断地问自己:“对于那些我认为理所当然但实际却随地区而异的习惯,我的一些代码和数据会不会无法适应这些习惯的变化呢?”学习各种可能的信息习惯并将所学的构建到代码中,这是开发人员应具备的一项关键技能。XML 提供了能做到这一点的重要基本工具,就看您能否习惯于使用这些工具了。 |