我正在尝试将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: {{balance}}{{/__}}
这样的事情,它就行不通了。我猜是因为内部标签首先被转换,因此无法找到该短语的翻译。
有关如何使用Mustache干净利落地实现这一目标的任何想法吗?
更新:这是最终结果片段(来自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');
}
}
答案 0 :(得分:4)
I added an i18n example here ......它非常俗气,但测试通过了。它看起来和你正在做的几乎一样。您是否有可能使用过时的Mustache版本?该规范用于指定不同的变量插值规则,这将使该用例不能按预期工作。
答案 1 :(得分: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 );
这是一个非常丑陋的例子,但你可以自己喜欢它。正如我所看到的那样,Mustache将无法做你想做的事。
希望有所帮助。