2012-02-03 134 views
1

我在我的PHP框架中使用XSLT作为模板引擎。我设置一些文本渲染脚本,该脚本将其转换为XML和传递到XSLTProcessor中:xslt国际化与PHP

<?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> 

所以,我有2种类型的文本中的观点:

  • 动态(从ActionController的$设置好的这 - > _ Renderer-> SOME_TEXT = '翻译的文本')
  • 硬编码在视图(这里要翻译一些文字d)

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

什么是在我的意见翻译文本的最佳方式?

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

感谢

回答

2

的最好方法是使用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> 

我希望这回答了你的问题

+0

非常感谢!这很令人惊讶,但它有可能以某种方式减少输入量:)每次我必须写3行代码来输出一些单词 – Tomas 2012-02-04 12:23:18

+0

那么,没有一个好的答案 - 你可以缩小它虽然有一行:':P – 2012-02-04 12:44:23

+0

Thanks for你的帮助 :) – Tomas 2012-02-04 13:45:03