我在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>
我希望这能回答您的问题