24

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

{% trans with {'%name%': 'Fabien'} from "app" %}
Hello %name%
{% endtrans %}

但我看不到如何使用它在翻译中注入这样的片段

<a href="{{ path('privacy') }}">privacy policy</a>

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

4

4 回答 4

41

我采取的方法是这样的:

在翻译文件中:

page.privacy.policy: Please read our %link_start%privacy policy%link_end%

在树枝文件中:

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

我不确定这是否可以使用您上面提到的块语法来完成,因为我发现它不起作用,除非我通过“原始”过滤器传输翻译结果。我还使用消息域来拆分翻译,因此使用了“帐户”参数。

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

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

编辑:

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

于 2012-07-18T17:23:41.167 回答
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 过滤器。有必要在此处放置一些过滤器以使原始过滤器仅适用于链接标签。

于 2013-08-09T10:07:47.807 回答
3

这是一个更好的方法:

{{ 'Please read our %privacy_policy%'|trans({
    '%privacy_policy%': '<a href="' ~ path('privacypolicy') ~ '"> ' ~ 'Privacy Policy'|trans ~ '</a>'
})|raw }}
于 2016-06-08T10:14:17.777 回答
0

枝条:

{{'body.term'|trans('%link_terms%' :app.request.getSchemeAndHttpHost()~path('terms')},'AcmeTerm')|raw }}

AcmeTerm.yml

body
    term: >
      <ul>          
          <li>Read<a href="%link_terms%">Terms</a>.</li>
      </ul>

其中 path('terms') 是如下路线:

it__RG__terms                             ANY      ANY    ANY  /it/termini-e-condizioni
en__RG__terms                             ANY      ANY    ANY  /en/terms-and-conditions
于 2013-10-05T11:45:54.323 回答