2012-01-01 3 views
5

Я пытаюсь использовать Усы вместе с i18n (php, в Wordpress). У меня есть базовые функции __ работает хорошо, что-то вроде этогоусы i18n с параметрами

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

Затем вывести шаблон со строкой i18n, я могу просто сделать это

$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}}{{/__}} не работает. Я предполагаю, потому что внутренний тег сначала преобразуется, поэтому перевод не может быть найден для этой фразы.

Любые идеи, как достичь этого с Усы?

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 ... это довольно дрянной, но тест проходит. Похоже, это почти то же самое, что и вы. Возможно ли, что вы используете устаревшую версию Усы? Спецификация, используемая для указания различных правил интерполяции переменных, которые заставили бы этот прецедент работать не так, как ожидалось.

+0

Это похоже на то, что я искал ... вместе с [этот комментарий] (https://github.com/bobthecow/mustache.php/issues/69#issuecomment-3347583) на github – 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

Спасибо за внимание. На самом деле это не решает проблему, и я бы не назвал ее чистым. Это приводит к ухудшению ситуации в некоторых случаях для поддержания всех этих тегов и условных выражений и т. Д. Удивительно, что у Усы не существует встроенной поддержки интернационализации в шаблонах. – gingerlime

+0

Сделай сам. Никогда не говорил, что это чистое решение. Я первый параргаф уже предложил использовать обычный полностью функциональный движок шаблонов. ;) – Eugene