技巧:开发本地化的XML格式

80酷酷网    80kuku.com

  xml|技巧国际化支持是 XML 的主要优势之一。遗憾的是,极少有XML格式提供使内容本地化的机制。本技巧文章向您演示了如何开发本地化的 XML 格式。

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 提供了能做到这一点的重要基本工具,就看您能否习惯于使用这些工具了。

参考资料

无论您的开发工作以何种方式涉及到了日期,都不妨查阅 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 文档。

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: