mustache i18n с параметрами

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

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

Есть идеи, как добиться этого с помощью 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');
  }   
}   
5
задан gingerlime 5 January 2012 в 10:29
поделиться