Я пытаюсь использовать Усы вместе с 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: {{balance}}{{/__}}
, это не сработает. Я предполагаю, потому что внутренний тег конвертируется первым и, следовательно, перевод фразы не найден.
Есть идеи, как добиться этого чисто с усами?
ОБНОВЛЕНИЕ: вот фрагмент конечного результата (с огромной помощью 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');
}
}