You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:25:29