我想在我的项目中使用Twig(v1.15.0)来替换我们自制的模板引擎。它使用特定的分隔符来替换变量,[[...]]或管理本地化字符串,[%...%]。
<table>
<tr>
<td>[%myLocalizedString%]</td>
<td>[[myVarToReplace]]</td>
</tr>
</table>
出于遗留和兼容性原因,我不想修改所有现有模板来替换每个分隔符。
对于变量,这不是什么大问题,我只需要设置Twig词法分析器的选项:
$twig = new Twig_Environment();
$lexer = new Twig_Lexer($twig, array(
'tag_comment' => array('{#', '#}'),
'tag_block' => array('{%', '%}'),
'tag_variable' => array('[[', ']]'), // was array('{{', '}}')
'interpolation' => array('#{', '}'),
));
$twig->setLexer($lexer);
在本地化分隔符的情况下并不那么简单。最初我想做那样的事情:
$twig = new Twig_Environment();
$lexer = new Twig_Lexer($twig);
$lexer->addDelimiter('tag_localize', array('[%', '%]'), 'functionToCall');
但它似乎尚未实施。
最终的解决方案是扩展Lexer类并在我的twig环境中使用它。 但我想避免这种情况。
有没有更好的解决方案?
答案 0 :(得分:0)
我相信你已经知道了:在Twig中你使用I18n扩展进行翻译。该扩展程序提供了“反式”代码:see i18n docs
我认为你无法通过扩展Lexer类将翻译语法[%Hello world%]
转换为Twig方式{% trans %}Hello world{% endtrans %}
,因为{%
是一个块元素而trans
a I18n扩展中定义的标记。您可以构建自己的翻译逻辑,但我认为创建一个用[%
替换{% trans %]
和%}
替换{% endtrans %}
的预处理器要容易得多。
我想它可以像这样工作(未经测试):
class MYTwigEnvironment extends Twig_Environment {
public function compileSource($source, $name = null) {
/*
* code to replace '[%' with '{% trans %}' in $source
* comes here ...
*/
return parent::compileSource($source, $name = null);
}
}
据我了解,这样模板缓存应该保持不变。
问候