2012-01-01 8 views
5

私はMustacheとi18n(php、Wordpress内)を併用しようとしています。私は、このような何かひげそりパラメータ付きの口頭番号

class my_i18n { 
    public function __trans($string) { 
    return __($string, 'theme-name'); 
    } 
} 
class mytache { 
    public function __() 
    { 
    return array('my_i18n', '__trans'); 
    } 
} 

その後出力に国際化文字列でテンプレートをうまく働い__基本的な機能を持って、私は単にこれまでのところ、すべてがうまくている。この

$context = new mytache; 
$template = "<div>{{#__}}String to translate{{/__}}</div>"; 
$m = new Mustache; 
echo $m->render($template, $context); 

を行うことができます。しかし、私はパラメータで文字列を翻訳できるようにしたい。すなわちsprint_f(__('Account Balance: %s'), $balance);に相当します。

私は{{#__}}Account Balance: {{balance}}{{/__}}のような何かをすると動作しないようです。内側のタグが最初に変換されるため、フレーズの翻訳が見つかりませんので、私は推測しています。

Mustacheでこれをきれいに達成する方法はありますか?

UPDATEは:ここ(bobthecowから巨大な助けを借りて)最終結果の抜粋です:私に代わって

class I18nMapper { 
    public static function translate($str) { 
     $matches = array(); 
     // searching for all {{tags}} in the string 
     if (preg_match_all('/{{\s*.*?\s*}}/',$str, &$matches)) { 
      // first we remove ALL tags and replace with %s and retrieve the translated version 
      $result = __(preg_replace('/{{\s*.*?\s*}}/','%s', $str), 'theme-name'); 
      // then replace %s back to {{tag}} with the matches 
      return vsprintf($result, $matches[0]); 
     } 
     else 
      return __($str, 'theme-name'); 
    } 
} 

class mytache { 
    public function __() 
    { 
    return array('I18nMapper', 'trans'); 
    } 
} 
+1

「それは動作しません」>。< –

+0

ひげそりテンプレートから文字列を抽出するのにどのようなキーワードを使用しましたか? –

答えて

4

I added an i18n example here ...かなりチーズですが、テストに合格します。それはあなたがやっていることとほぼ同じように見えます。 Mustacheの古いバージョンを使用している可能性はありますか?この仕様はさまざまな変数補間ルールを指定するために使用され、このユースケースは期待どおりに機能しません。

+0

これは私が探していたもののようです... githubの[このコメント](https://github.com/bobthecow/mustache.php/issues/69#issuecomment-3347583)と一緒に – gingerlime

0

私は通常、完全に機能するテンプレートエンジンを使用してお勧めします。私は理解しています、小さいことは素晴らしく、すべてですが、例えばTwigははるかに進歩しています。だから私はそれをお勧めします。

ヒヒについて。翻訳方法を広げることはできません!たとえば、あなたは{{#__}}Account Balance: #balance#{{/__}}

function __($string, $replacement) 
{ 
    $replaceWith = ''; 

    if ('balance' == $replacement) 
    { 
     $replaceWith = 234.56; 
    } 

    return str_replace('#' . $replacement . '#', $replaceWith, $string); 
} 

class my_i18n 
{ 
    public function __trans($string) 
    { 
     $matches  = array(); 
     $replacement = ''; 

     preg_match('~(\#[a-zA-Z0-9]+\#)~', $string, $matches); 

     if (! empty($matches)) 
     { 
      $replacement = trim($matches[0], '#'); 
     } 

     return __($string, $replacement); 
    } 
} 

$Mustache = new Mustache(); 
$template = '{{#__}}Some lime #tag#{{/__}}'; 
$MyTache = new mytache(); 

echo $Mustache->render($template, $MyTache); 

を渡すこれは非常に醜い一例ですが、あなたはそれが自分自身を空想することができます。私が見ているように、それ自身の上の口ひげはあなたが望むことをすることができません。

希望しました。

+0

努力をいただきありがとうございます。これは実際に問題を解決するものではありません。 Mustacheは、テンプレート内での国際化のサポートを組み込んでいないように見えるのは驚くべきことです。 – gingerlime

+0

あなた自身をやってください。これはきれいな解決策であるとは言いません。私は最初のパラゴフとして、すでに完全に機能する通常のテンプレートエンジンの使用を提案しました。 ;) – Eugene

関連する問題