在Twig模板中添加翻译内容中的链接

Rob*_*rto 23 symfony twig

在Twig模板中,我需要一个包含链接的翻译文本(路径应该由路由器生成,而不是静态嵌入).Twig不允许在trans块中呈现变量 - 我也知道以下内容:

{% trans with {'%name%': 'Fabien'} from "app" %}
Hello %name%
{% endtrans %}
Run Code Online (Sandbox Code Playgroud)

但是我看不出如何使用它来在翻译中注入这样的作品

<a href="{{ path('privacy') }}">privacy policy</a>
Run Code Online (Sandbox Code Playgroud)

(当然,锚文本也应该被翻译)

red*_*rdo 36

我采取的方法是这样的:

在翻译文件中:

page.privacy.policy: Please read our %link_start%privacy policy%link_end%
Run Code Online (Sandbox Code Playgroud)

在twig文件中:

<p>{{ 'page.privacy.policy' | trans({'%link_start%' : '<a href="'~path('privacy-policy')~'">', '%link_end%' : '</a>'}, 'account') | raw }}</p>
Run Code Online (Sandbox Code Playgroud)

我不确定是否可以使用上面提到的块语法来完成,因为我发现它不起作用,除非我通过'raw'过滤器传输了翻译结果.我还使用消息域来分割翻译,因此使用'account'参数.

我认为最接近你的例子的是:

<p>{{ 'Please read our %link_start%privacy policy%link_end%' | trans({'%link_start%' : '<a href="'~path('privacy-policy')~'">', '%link_end%' : '</a>'}) | raw }}</p>
Run Code Online (Sandbox Code Playgroud)

编辑:

我遇到的这种方法的唯一问题是我需要以编程方式跟随单元测试中的翻译链接,因为没有单个翻译表示链接文本.虽然凌乱但我认为可以通过为链接文本提供单独的翻译并将其翻译的值替换为全文作为附加变量来绕过这一点.


小智 7

rebdirdo的解决方案不是很安全,因为它没有逃避整个消息.对于像这样的消息"don't use <b> tag, use <strong> tag instead. %link_start%Here%link_end% you can find why.",它无法正常工作,因为标签不会被转义并且不可见.

工作方式:

翻译文件:

advises.strong: don't use <b> tag, use <strong> tag instead. %link_start%Here%link_end% you can find why.

树枝文件:

{{ 'advises.strong'|trans|nl2br|replace({'%link_start%': '<a href="'~path('privacy-policy')~'">', '%link_end%': '</a>'})|raw }}

注意nl2br过滤器.有必要在那里放置一些过滤器,使原始过滤器仅适用于链接标签.