I18N的XML文档

时间:2009-03-28 13:44:20

标签: xml localization internationalization

我即将决定如何处理基于XML的UI描述格式的国际化。

格式通常如下所示:

...
<devif>
  <screen id="scr1" title="Settings for this and that">
    <header text="Climate readings"/>
    <rd setp="123" text="Air temperature" unit="°C"/>
    <rd setp="234" text="Humidity" unit="%RH"/>
    <rd setp="345" text="CO2" unit="ppm"/>

    <header text="Settings"/>
    <wr setp="567" text="Air temperature demand" unit="°C"/>
  </screen>
  ...
</devif>

每个文件都包含大量屏幕,最多可包含10,000行,我们的应用程序中有十几个这样的文件。

我仍然可以更改格式以满足我们的需求。那么你将如何翻译呢?

我一直在考虑一些可能的方法来解决这个问题:

  • 包含英文文本和翻译文本的每种语言的单独文件
  • 为每个标记使用ID,并为每个标识使用带有翻译文本的单独文件
  • 将所有翻译放在同一档案中

第一个解决方案存在的问题是,英文文本可能会根据上下文转换为不同的消息。

第二种解决方案使源文件的可读性降低(尽管不是很多),并且它不能轻易处理属性的转换。

一旦将文件翻译成5-6种语言,第三种解决方案会使文件变得非常庞大和繁琐。

3 个答案:

答案 0 :(得分:2)

我们使用标准的TMX文件,它们是标准的XML文件来保存国际化的文字。每个条目都由一个标签标识,该标签是代码周围的参考。每个条目都有所有可能的翻译,最重要的部分是TMX是翻译计划和专业人士使用的标准。

如果您已经拥有XML文件来保存文字,则可以通过XSLT样式表进行转换。

以下是格式示例:

<?xml version="1.0" encoding="UTF-8"?>
<tmx>
    <body>
        <tu tuid="$ALARM_BARCODE_READER_COMMS">
            <tuv lang="ES">
                <seg>Lector códigos de barras: No Operativo</seg>
            </tuv>
            <tuv lang="EN">
                <seg>Barcode reader: Not operative</seg>
            </tuv>
            <tuv lang="ZH">
                <seg>读卡器:通讯错误</seg>
            </tuv>
        </tu>
        <tu tuid="$ALARM_BARCODE_READER_FAIL">
            <tuv lang="ES">
                <seg>Lector códigos de barras: Fallo</seg>
            </tuv>
            <tuv lang="EN">
                <seg>Barcode Reader: Fail</seg>
            </tuv>
            <tuv lang="ZH">
                <seg>读卡器:故障</seg>
            </tuv>
        </tu>
        <tu tuid="$NO_PAYMENT_MODE_AVAILABLE">
            <tuv lang="ES">
                <seg>No hay sistemas de pago disponibles</seg>
            </tuv>
            <tuv lang="EN">
                <seg>No payment systems available</seg>
            </tuv>
            <tuv lang="ZH">
                <seg>读卡器:故障</seg>
            </tuv>
        </tu>       
        <tu tuid="$ALARM_BLACKLIST_CARD">
            <tuv lang="ES">
                <seg>Tarjeta de pago en lista negra</seg>
            </tuv>
            <tuv lang="EN">
                <seg>Payment card in blacklist</seg>
            </tuv>
            <tuv lang="ZH">
                <seg>付费的IC卡是黑名单卡</seg>
            </tuv>
        </tu>
   </body>
</tmx>

答案 1 :(得分:1)

为什么不使用XML实体来定义必须本地化的术语,并且每种语言都有单独的DTD?这基本上是Firefox XUL使用的方法,例如:Localization on MDN

答案 2 :(得分:1)

我会创建一个模板文件,例如命名为“somename.xml.template”

<devif>
  <screen id="scr1" title="[SettingsForThisCard]">
    <header text="[ClimateReadings]"/>
    <rd setp="123" text="[AirTemperature]" unit="°C"/>
...

然后,您可以为包含以下内容的每种语言创建一堆类似ini的文件:

SettingsForThisCard =您给定语言的消息

然后,您可以使用从ini文件中获取的消息替换标记。优点是,如果标签没有翻译,则易于检测并且不会浪费翻译工作。此外,它非常简单,因此可能不是满足您特定要求的最佳选择。