XML 的主要优势之一是其对国际化的支持。它的核心字符集 Unicode 提供了机制来支持更具地区普及性的系统 ― 如欧洲的 ISO-8859 变体、日本的 Shift-JIS 或中国的 BIG-5。这很好。在最初以狭隘的地域观点开发了应用程序后,为了进行国际化部署,人们不得不投入大量财力来改写它们。然而,对于国际化来说,所需的工作远比对国际化字符集的支持要多。能够根据一组特定的语言和文化习惯来定制表示信息的方法,这也很重要。这就是所谓的 本地化。
从数据格式本身(这正是使用 XML 的便利之处)来讲,本地化的某些方面(如日期格式和姓名次序)可以用基本的 XML 功能加以解决。一种方法是使用国际标准形式;一个很不错的示例是日期,对日期最好是使用 ISO 8601 标准(请参阅 参考资料)。 清单 1有一个示例:
清单 1. 地区(美国)日期及其本地化后的日期
<?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显示了为更好地支持这样的本地习惯所构造的一个数据示例。
清单 2. 用于本地化的结构化姓名格式的示例
<?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 提供了在元素内容和属性值中使用的语言规范。您可以为每个元素设置语言。 清单 3是同时具有英语和西班牙语元素的 XML 文档示例。
清单 3. 其元素具有本地化语言形式的 XML 文档。
<?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 属性,您仍必须在模式中提供它。
清单 4中的 DTD 片段说明了这一点:
清单 4. 支持 xml:lang 的 DTD
<!ATTLIST item xml:lang NMTOKEN #IMPLIED "en"> |
该声明添加了对该属性的支持,并设置了缺省值
en ,以免该属性被忽略。请注意,我没有添加对
id 属性的声明,通常是需要它的。
本地化所需要做的工作远不止本文所介绍的。对开发人员而言,通常这更多的是一种通用思想而不是一套一成不变的规则。您必须不断地问自己:“对于那些我认为理所当然但实际却随地区而异的习惯,我的一些代码和数据会不会无法适应这些习惯的变化呢?”学习各种可能的信息习惯并将所学的构建到代码中,这是开发人员应具备的一项关键技能。XML 提供了能做到这一点的重要基本工具,就看您能否习惯于使用这些工具了。
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 无论您的开发工作以何种方式涉及到了日期,都不妨查阅 Markus Kuhn 的
Summary of the International Standard Date and Time Notation并给它加上书签。W3C 对
Date and Time Formats的说明也值得一看。
- 请阅读
RFC 1766 ― “Tags for the Identification of Languages”,它定义了
xml:lang标记中语言项的允许值。
- 查看
EXSLT以获得有用的和被广泛支持的 XSLT 扩展函数。尤其
dates and times模块有用于操作日期的函数。
- 请访问国际标准 ISO 8601,它规定了
日期和时间的数字表示法。
- 您可以在
developerWorks XML 技术专区找到更多 XML 参考资料。
- 顺便访问一下
IBM developerWorks Unicode 主题以获得关于国际化和本地化的更多信息。
- 请研究一下
IBM WebSphere Studio Application Developer,这是一种易于使用的集成开发环境,用于构建、测试和部署 J2EE 应用程序,包括从 DTD 和模式生成 XML 文档。
- 看看您如何才能成为
XML 和相关技术的 IBM 认证开发人员。
- 想让我们每周为您发送与本文相似的有用的 XML 技巧文章吗?请注册订阅
developerWorks
XML 技巧时事通讯。

Uche Ogbuji 是 Fourthought Inc.的顾问兼共同创始人,该公司是专为企业知识管理提供 XML 解决方案的软件供应商和咨询公司。Fourthought 开发了 4Suite,它是一个用于 XML、RDF 和知识管理应用程序的开放源码平台。Ogbuji 先生是一位出生于尼日利亚的计算机工程师和作家,他目前在美国科罗拉多州博耳德生活和工作。可以通过 uche.ogbuji@fourthought.com与 Ogbuji 先生联系。