2012-02-03 91 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