web-dev-qa-db-ja.com

TwigでHTMLをエスケープせずにtransタグを使用します

Twigテンプレートのtransタグ内にHTMLを含む変数を使用します(変数には、リンクの異なる位置に表示されるリンクの開始と終了が含まれます別の言語の文。)

いくつかの "Drupal 8 Twigテンプレートと翻訳"に関するドキュメント) があり、transタグ内の変数には|placeholder- filterと|raw- filter(古いバージョンの場合:|passthrough)。

これらのフィルターを使用しても、出力に違いはありません。
これが私のテンプレートです:

{% set string = '<strong>&amp;</strong>' %}
<div>
  {% trans %}
    Escaped: {{ string }}
  {% endtrans %}
</div>
<div>
  {% trans %}
    Pass-through: {{ string|raw }}
  {% endtrans %}
</div>
<div>
  {% trans %}
    Placeholder: {{ string|placeholder }}
  {% endtrans %}
</div>

そしてここに出力があります:

Escaped: <strong>&amp;</strong>
Pass-through: <strong>&amp;</strong>
Placeholder: <strong>&amp;</strong>

エスケープをオフにするフィルターはありますか?

2
Philipp Zedler

AFAIK the Twig trans tag in Drupal 8が実装され、Twigに慣れ親しんでいるマーマーへの翻訳を容易にしました。

内部的には、通常のDrupal翻訳関数 t() またはDrupalと同じ種類の翻訳文字列を処理します。 Twig filter | tですが、transブロック内で使用するすべての変数は@ variableまたは%variable翻訳文字列内のプレースホルダー。

翻訳関数内のこれらのプレースホルダーは、翻訳に挿入される前に常にHTMLをエスケープします。 FormattableMarkup オブジェクトを渡す場合を除いて、渡す値をエスケープしない方法に関係なく。

消毒されていない変数({{ variable|raw }} in Twigテンプレートまたは!variable(翻訳文字列)はDrupal 8の翻訳では非推奨であり、最新の8.x Drupalバージョンでは機能しません。 translation API説明 は少し時代遅れです。

ユースケースでは、HTMLリンクタグを翻訳文字列に追加して、リンクURL自体を変数にすることができます。残念ながら、Twig transタグはまだその種の変数をサポートしていません(比較 this コアの問題)。)代わりにtフィルターを使用する必要があります:

{{ 'A <a href=":url">link</a> example in a translation.'|t({ ':url': url }) }}

上記の例は、翻訳文字列と一致します。

en:A <a href=":url">link</a> example in a translation.

de:Ein Beispiel-<a href=":url">Link</a> in einer Übersetzung.

6
Mario Steinitz