【问题标题】:Localization with xslt, do any standards exist that deal with different languages in XML?使用 xslt 进行本地化,是否存在处理 XML 中不同语言的任何标准?
【发布时间】:2015-09-11 11:59:56
【问题描述】:

我正在处理一个项目,我需要创建一个支持来自 xslt 转换的多种语言的 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 文件,或者在这样的“translate.xml”中命名标签等的某种最佳实践?

【问题讨论】:

    标签: xslt localization


    【解决方案1】:

    好问题!

    是的,有一种处理语言的标准化方法。使用xml:lang attribute。命名空间神奇地存在于任何 XML 文档中,并且是核心 XML 规范的一部分。根据RFC-4646defined 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,这与 the lang() function 一起使用非常好,the lang() function 从最近的祖先或自身获取适用的语言,如果找到则返回布尔值 true。如果你设置了主要语言,它也会找到像en-US这样的语言变体,比如en

    以下假设 XSLT 1.0,但也适用于 2.0 和 3.0(此代码已由 Michael 更正,请参阅 cmets):

    <!-- 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() 函数。

    【讨论】:

    • @michael,谢谢,我显然忘记了 lang() 函数自 XPath 1.0 以来就已经存在,这绝对比检查 xml:lang 的单个值要好。尽管您的建议不起作用,但 xml:lang 属性并未在词法上应用于后代。 A. 更新。
    • 对不起,我测试错了。但我明白了,主要想法通过了。 -- 注意:在 XSLT 1.0 中,您不能在匹配模式中使用变量。并且lang() 必须有一个参数:lang('en') 返回一个布尔值。
    • @michael,显然,我对 1.0 越来越生疏了:P,感谢您让我保持警惕 :)。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多