2012-01-01 15 views
5

Sto provando ad usare i baffi insieme a i18n (php, all'interno di Wordpress). Ho la funzionalità di base __ lavorando bene, qualcosa di similebaffi i18n con parametri

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

Poi per produrre un modello con una stringa i18n, posso semplicemente fare questo tutto

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

Finora va bene. Tuttavia, voglio essere in grado di tradurre stringhe con parametri. cioè l'equivalente di sprint_f(__('Account Balance: %s'), $balance);.

Sembra che se faccio qualcosa come {{#__}}Account Balance: {{balance}}{{/__}} non funziona. Sto indovinando perché il tag interno viene convertito prima e quindi la traduzione non può essere trovata per la frase.

Qualche idea su come ottenere questo risultato con Mustache?

UPDATE: ecco il frammento di risultato finale (con l'aiuto di massiccia 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

"non funziona">. < –

+0

Quale parola chiave hai usato per estrarre le stringhe dal modello dei baffi? –

risposta

4

I added an i18n example here ... è piuttosto scadente, ma il test è valido. Sembra che sia quasi lo stesso di quello che stai facendo. È possibile che tu stia utilizzando una versione obsoleta di Moustache? La specifica utilizzata per specificare diverse regole di interpolazione delle variabili, che renderebbero questo caso d'uso non funzionante come previsto.

+0

Questo sembra la cosa che stavo cercando ... insieme a [questo commento] (https://github.com/bobthecow/mustache.php/issues/69#issuecomment-3347583) su github – gingerlime

0

Da parte mia vi suggerirei di usare normali, template engine completamente funzionale. Capisco, quel piccolo è grande e tutto, ma per esempio Twig è molto più avanzato. Quindi lo consiglierei.

Informazioni sui baffi. Non puoi semplicemente estendere il tuo metodo di traduzione! Per esempio si passa {{#__}}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); 

Questo è un brutto esempio, ma si può fare da soli immaginano. Come ho visto, Mustache non sarà in grado di fare quello che vuoi.

Spero che questo abbia aiutato.

+0

Grazie per lo sforzo. Questo non risolve veramente il problema, e non lo definirei veramente pulito. Rende le cose peggiori in qualche modo dovendo mantenere tutti quei tag e condizionali ecc. È sorprendente che Moustache non sembra avere un supporto integrato per l'internazionalizzazione all'interno dei template. – gingerlime

+0

Fai da solo. Mai detto, questa è una soluzione pulita. Già il primo paragone suggerivo l'utilizzo di un normale motore di template completamente funzionale. ;) – Eugene