使用xslt进行本地化,是否存在处理XML中不同语言的任何标准?

时间:2015-09-11 11:59:57

标签: xslt localization

我正在使用一个项目,我需要创建一个支持xslt-transformation的多种语言的html文件。我已经阅读了几篇关于此的文章,并在stackoverflow中查看了之前的问题,如下所示: xslt localization

将翻译放在单独的xml文档中的解决方案就像我想要的那样。但是我想知道" translate.xml"是否存在任何标准化/最佳实践。文件?在上面引用的帖子中,以下给出了一个例子:

<strings>
    <string language="en" key="ContactDetails">Contact Details</string>
    <string language="sv" key="ContactDetails">Kontaktuppgifter</string>
    [...]
</strings>   

正如我所说,建议使用密钥从transalte.xml中检索字符串按照我的意愿工作,但我喜欢使用标准,如果它们可用,那么我的问题是,是否有标准化的模式这些类型的xml文件,或者在这样的&#34; translate.xml&#34;中标记等的某种最佳实践?

1 个答案:

答案 0 :(得分:1)

好问题!

是的,有一种处理语言的标准化方法。使用xml:lang attribute。命名空间神奇地存在于任何XML文档中,并且是核心XML规范的一部分。根据{{​​3}},它是defined to take a language specifier。这些是常见的说明符,如enen-USeses-BR,指定主要语言和语言变体。

它的工作方式有点像名称空间。如果你在一个元素上定义它,那么它将由该元素的所有后代继承,除非你重新定义它,或者取消定义它以表示语言独立元素。

例如:

<text xml:lang="en">
    We are 
    <t xml:lang="en-US">organizing</t>
    <t xml:lang="en-GB">organising</t>
    a conference on the effects of 
    <t xml:lang="en-US">color</t>
    <t xml:lang="en-GB">colour</t>
    in December this year.
</text>

使用带有复制习惯用法的查询语言,即XSLT,它与RFC-4646一起出色地工作,它从最近的祖先或自身获取适用的语言,如果找到则返回布尔值true。如果您设置主要语言,它也会找到en-US之类的语言变体,例如en

以下假设是XSLT 1.0,但也适用于2.0和3.0(此代码由Michael友情纠正,请参阅注释):

<!-- match English US language and default en -->
<xsl:template match="t[lang('en-US') or lang('en')">
    <xsl:apply-templates />
</xsl:template>

<!-- remove any other <t> -->
<xsl:template match="t" />

注意:始终在最外层元素上设置默认语言,因为如果根本找不到语言,lang()将返回false。您可以使用表达式lang('')对此进行测试,只有在根本没有设置语言时才会返回false。

关于XML文件,如果每种语言都有一个文件,并且不像上面建议的那样混合和匹配,您仍然可以通过在根元素上设置xml:lang来使用相同的方法。由于这将在整个树中继承,因此您仍然可以使用lang()函数。