web-dev-qa-db-ja.com

Twigテンプレートの翻訳済みコンテンツ内にリンクを追加する

Twigテンプレート内には、リンクを含む翻訳されたテキストが必要です(パスは静的に埋め込まれるのではなく、ルーターによって生成される必要があります)。Twigトランスブロック内で変数をレンダリングすることはできません-私は次のことも知っています:

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

しかし、それを使用して翻訳内にこのような部分を挿入する方法がわかりません

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

(もちろん、アンカーテキストも翻訳する必要があります)

23
Roberto

私が取ったアプローチはこれです:

翻訳ファイル内:

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

twigファイル:

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

変換の結果を「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>

編集:

私が遭遇したこのアプローチの唯一の問題は、リンクテキストを表す単一の翻訳がないため、単体テストで翻訳されたリンクをプログラムでたどる必要がある場合です。面倒ですが、リンクテキストに個別の翻訳を提供し、その翻訳された値を追加の変数としてフルテキストに置き換えることで、これを回避できると思います。

37
redbirdo

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フィルターに注意してください。生のフィルターがリンクタグに対してのみ機能するようにするには、そこにフィルターを配置する必要があります。

7
J4rmu1

これはより良い方法です:

{{ 'Please read our %privacy_policy%'|trans({
    '%privacy_policy%': '<a href="' ~ path('privacypolicy') ~ '"> ' ~ 'Privacy Policy'|trans ~ '</a>'
})|raw }}
2
the_nuts

小枝:

{{'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
0
Barno