如何在Twig的trans标签中保留{{ }}变量括号以兼容Sendgrid?
解决Twig trans标签与Sendgrid Handlebars变量冲突的方案
以下是几个可行的解决办法,既能保留Handlebars的{{ }}语法不被Twig解析,又能保证翻译内容的完整性:
方法1:使用trans标签的占位符替换(推荐)
利用Twig trans标签原生的占位符功能,将Handlebars变量作为参数传入,避免在trans文本中直接写{{ }}:
{% trans with {'%job%': '{{ job }}'} %}I am a %job%{% endtrans %}
- 原理:trans标签内的
%job%是纯文本占位符,不会触发Twig解析;通过with参数将{{ job }}作为字符串传入,最终渲染后会保留完整的Handlebars语法,同时完成翻译。 - 优势:无需额外扩展,语法简洁,翻译内容完整,不会拆分括号,避免语言兼容性问题。
方法2:提前用verbatim定义Handlebars变量
先通过verbatim标签生成未解析的Handlebars变量,再传入trans标签:
{# 定义未被Twig解析的Handlebars变量 #} {% set job_handlebars %} {% verbatim %}{{ job }}{% endverbatim %} {% endset %} {# 传入trans标签完成翻译 #} {% trans with {'%job%': job_handlebars} %}I am a %job%{% endtrans %}
- 原理:
verbatim标签会让Twig跳过内部内容的解析,直接输出{{ job }};将这个结果作为变量传入trans的占位符,既完成翻译又保留所需语法。
方法3:自定义Twig函数生成Handlebars变量
如果项目中有大量类似需求,可以自定义一个Twig函数来统一生成Handlebars变量:
// 自定义Twig扩展函数 public function getFunctions() { return [ new TwigFunction('hb_var', function ($varName) { return '{{ ' . $varName . ' }}'; }), ]; }
在模板中使用:
{% trans with {'%job%': hb_var('job')} %}I am a %job%{% endtrans %}
- 原理:自定义函数直接返回拼接好的Handlebars语法字符串,传入trans占位符后,Twig不会解析它,最终直接输出给Sendgrid处理。
内容的提问来源于stack exchange,提问作者Jeroen de Beer
相关产品推荐
相关产品推荐

