2012-02-03 16 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 $からsettedこの - > _ Renderer-> some_text = '翻訳可能なテキスト')
  • はここ(ビューにハード変換するためにいくつかのテキストですD)

を私はdocument()機能を使用してXSLTでHarcodedテキストを()変換するためのXML辞書を使用することができますが、どのようにするときActionControllerからsettedテキストを翻訳しますか?

私のビューでテキストを翻訳する最も良い方法は何ですか?

更新日: 翻訳テキストが見つからない場合は、デフォルト値を印刷できますか?

おかげ

答えて

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> 

EDIT:デフォルト値のためだけの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> 
を、あなたが新しいテンプレートを定義することができます)と言います

あなたも、次のように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

+0

それに良い答えはありません。 ':P –

+0

ありがとうございましたあなたの助け :) – Tomas