2012-01-01 22 views
5

Estoy tratando de usar Moustache junto con i18n (php, en Wordpress). Tengo el __ funcionalidad básica de trabajo muy bien, algo como estobigote i18n con los parámetros

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

A continuación, a la salida de una plantilla con una cadena i18n, que pueda hacer simplemente esto

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

Hasta ahora todo está bien. Sin embargo, quiero poder traducir cadenas con parámetros. es decir, el equivalente de sprint_f(__('Account Balance: %s'), $balance);.

Parece que si hago algo como {{#__}}Account Balance: {{balance}}{{/__}} no funciona. Supongo que porque la etiqueta interna se convierte primero y, por lo tanto, no se puede encontrar la traducción para la frase.

¿Alguna idea de cómo lograr esto limpiamente con Moustache?

ACTUALIZACIÓN: aquí está el fragmento de resultado final (con la ayuda masiva de 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

"no funciona">. < –

+0

¿Qué palabra clave usó para extraer las cadenas de la plantilla de bigote? –

Respuesta

4

I added an i18n example here ... es bastante cursi, pero la prueba pasa. Parece que eso es casi lo mismo que lo que estás haciendo. ¿Es posible que estés usando una versión obsoleta de Moustache? La especificación utilizada para especificar diferentes reglas de interpolación de variables, lo que haría que este caso de uso no funcione como se esperaba.

+0

Esto parece lo que estaba buscando ... junto con [este comentario] (https://github.com/bobthecow/mustache.php/issues/69#issuecomment-3347583) en github – gingerlime

0

Por mi parte me gustaría sugerir el uso de un motor de plantillas normal, completamente funcional. Entiendo, que lo pequeño es genial y todo, pero por ejemplo, Twig está mucho más avanzado. Así que lo recomendaría.

Acerca de bigote. ¿No puedes extender tu método de traducción? Por ejemplo se pasa {{#__}}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); 

Este es un ejemplo muy feo, pero puede hacer que se imaginan a sí mismo. Como veo que Moustache por sí solo no podrá hacer lo que quiera.

Espero que haya ayudado.

+0

Gracias por el esfuerzo. Esto realmente no está resolviendo el problema, y ​​realmente no lo llamaría limpio. En algunos aspectos, empeora las cosas al tener que mantener todas esas etiquetas y condicionales, etc. Es sorprendente que Moustache no parezca tener soporte incorporado para la internacionalización dentro de las plantillas. – gingerlime

+0

Haz uno tú mismo. Nunca dije, que esta es una solución limpia. Yo, el primer paráfago, ya sugerí el uso de un motor de plantilla completamente funcional. ;) – Eugene