使用php实现xslt国际化


xslt internationalization with php

我在PHP框架中使用XSLT作为模板引擎。我将一些文本设置为Renderer脚本,该脚本将其转换为xml并传递给XSLTProcessor:

<?php
class IndexController extends ActionAbstract {
    public function doAuth() {
        $this->_Renderer->some_text = 'Translatable text';
    }
}
?>

视图如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"/>
    <xsl:template match="/">
        <html>
            <head><title>Index.xsl</title></head>
            <body>
                Here is some text to be translated <br/>
                <xsl:value-of select="root/some_text"/>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

因此,我在视图中有两种类型的文本:

  • 动态(从ActionController$this->_Renderer->some_text设置为"可翻译文本")
  • 视图中的硬编码(以下是一些待翻译的文本)

我可以使用xml字典来翻译xslt中的Harcoded文本(使用document()函数),但如何翻译ActionController设置的文本?

在我看来,翻译文本的最佳方式是什么

更新:如果没有找到翻译文本,是否可以打印默认值

感谢

最好的方法是使用xslt键-您可以在这里找到示例:http://www.learn-xslt-tutorial.com/Working-with-Keys.cfm

就你的例子而言,它看起来像(我没有编译它,所以可能有一些拼写错误或错误):

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml"/>
        <xsl:key name="keyDict" match="entry" use="key"/>
        <xsl:param name="text_to_translate2" select="root/some_text"/>
        <xsl:template match="/">
            <html>
                <head><title>Index.xsl</title></head>
                <body>
                    <!-- Here is some text to be translated -->
                    <xsl:value-of select="key('keyDict','text_to_translate1')/value"/> <br/>
                    <xsl:value-of select="key('keyDict',$text_to_translate2)/value"/>
                </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>

您将需要具有以下结构的xml:

    <entry>
        <key>text_to_transalte1</key>
        <value>some text1</value>
    </entry>
    <entry>
        ...
    </entry>

编辑:对于默认值,只需添加到xml:中的条目

    <keyDict>
        <entry>
            <key>text_to_transalte1</key>
            <value>some text1</value>
        </entry>
        <entry>
            ...
        </entry>
        <default><value>No translation found</value></default>
    </keyDict>

或者,如果你想让每个键的默认值等于该键(我认为这很常见),那么你可以定义新的模板:

    <xsl:template name="dictLookup">
        <xsl:param name="key"/>
        <xsl:variable name="result" select="key('keyDict',$key)/value"/>
        <xsl:choose>
            <xsl:when test="not($result)">
                <xsl:value-of select="$key"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$result"/>
            <xsl:otherwise>
        </xsl:choose>
    </xsl:template>

然后用param:调用此模板

    <xsl:call-template name="dictLookup">
        <xsl:with-param name="key" value="some value"/>
    </xsl:call-template>

您甚至可以添加另一个名为default的参数来调用tamplate,如下所示:

    <xsl:call-template name="dictLookup">
        <xsl:with-param name="key" value="some value"/>
        <xsl:with-param name="default" value="default value"/>
    </xsl:call-template>

我希望这能回答您的问题