我正在使用一个项目,我需要创建一个支持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;中标记等的某种最佳实践?
答案 0 :(得分:1)
好问题!
是的,有一种处理语言的标准化方法。使用xml:lang
attribute。命名空间神奇地存在于任何XML文档中,并且是核心XML规范的一部分。根据{{3}},它是defined to take a language specifier。这些是常见的说明符,如en
,en-US
,es
,es-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()
函数。