2011-06-25 12 views
3

まず、私がドイツ出身であることを教えてください。だから私の英語はうまくいかないでしょう。私を許してください。 = PSmartyを複数の言語に対応させるには

私はPHP5で多言語ウェブサイトを開発しようとしています。プレゼンテーション層とビジネスロジックを分離するために、SmartyTemplateEngine(v3.0.8)を使用しています。それを多言語にするには、時々this SmartyPluginを編集しなければならなかった。しかし、ついにそれは私のために働いています。私はそれをそのように使用しています:

{lang}language.string{/lang}

language.string = <![CDATA[Hello world!]]>(だから、こんにちは、世界を語る!)

作品罰金:私が持っている言語ファイルで

。しかし、もう少しスクリプトを使いたいです。言語文字列に変数を渡したいと思います。このような何か:私は持っているしたい言語ファイルで

{lang s=$userName}language.string{/lang}

language.string = <![CDATA[Hello %s!]]>(だから、ユーザ名こんにちは言う!)

私はGoogleと私の解決策を見つけることを試みたが、私は何か良いものを見つけることができませんでした。 PHPの専門家でない限り、自分で編集することはできません。誰かが私を助けてくれることを願っています。それは...私に

挨拶し、 バスティ

答えて

9

まあ、私はこのプラグインを使用していないが、かなり長い間を悩ませますが、同じことをしなければなりませんでした。私は初期化私Localizerクラスで

<translations> 
    <translation id="hello_world"><![CDATA[Hello ##username##!]]></translation> 
    <translation id="how_are_you"><![CDATA[How are you?]]></translation> 
</translations> 

私は私の文字列を定義するXMLファイル(この例では、xml/en/content.xmlです):私は私のニーズのために次のことが最善の解決策だったことをfigueredこれらの翻訳を配列に保存します。 translate関数は、smartyからID文字列を取得し、そのIDを翻訳で検索し、##string##テキストを検索します。これらの##...##はsmartyに既に割り当てられている変数に置き換えられます。

class Localizer { 

    private static $translations = array(); 

    public static function init($language) { 

     $temp_content = simplexml_load_file('xml/' . $language . '/content.xml'); 
     foreach ($temp_content as $key => $value){ 
      self::$translations[(string)$value['id']] = (string)$value; 
     } 

    } 

    public static function translate($params, $name, $smarty) { 

     $translation = ''; 
     if(! is_null($name) && array_key_exists($name, self::$translations)) { 

      // get variables in translation text 
      $translation = self::$translations[$name]; 
      preg_match_all('/##([^#]+)##/i', $translation, $vars, PREG_SET_ORDER); 

      // replace with assigned smarty values 
      foreach($vars as $var) { 
       $translation = str_replace($var[0], $smarty->getTemplateVars($var[1]), $translation); 
      } 

     } 

     return $translation; 

    } 

} 

これで、どの機能を使用すべきかをsmartyに伝える必要があります。これはあなたのindex.php次のようになります。

include('Localizer.class.php'); 
Localizer::init('en'); 
$smarty->registerPlugin('block', 'translate', array('Localizer', 'translate'), true); 

翻訳を使用するには、まず、私は、ユーザー名を割り当てます。

$smarty->assign('username', $username); 

テンプレートファイルで:

{translate}hello_world{/translate} 

希望これは、挨拶を支援しますオーストリア:)

+0

@Sascha Galley 本当にありがとう あなたの助け。それは素晴らしいです。しかし、あなたが話しているローカライザークラスについては、わかりません。スマートフォン全体を検索しました。ローカライザークラスはありません。あなたもそれで私を助けることができますか?別のプラグインを使用していますか?おそらくそれ? http://smarty.incutio.com/?page=LocalizerPlugin – Basti

+0

@Bastiそのクラスは自分で構築します。答えを編集し、今すぐ明確になることを願っています。 –

+0

@Sascha Galleyああ、大丈夫です。それは理にかなっている。私はとても愚かであることを本当に残念です。私はそれを実行させることはできません。私は今、次のようにしました: Smarty.class.phpと同じディレクトリにLocalizer.class.phpを作成しました。それは上記のコードを含んでいます。では、翻訳機能をどこに置くべきかわかりません。私はそれがgarantueする必要があります、テンプレートの機能がうまくいくだろうと思います。だからそれを行う方法? function.translation.phpに関数を置くことはできません。 Sry、それを取得していないため... – Basti

関連する問題