Я пытаюсь использовать 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');
}
}