web-dev-qa-db-fra.com

Utilisez la balise trans dans Twig sans échapper le HTML

Je voudrais utiliser des variables contenant du HTML à l'intérieur d'une balise trans dans mon modèle Twig. (Les variables contiennent le début et la fin d'un lien qui apparaît à différentes positions dans le phrase pour différentes langues.)

Il y a documentation sur "Drupal 8 Twig Templates and Translations" qui explique que pour les variables à l'intérieur de la balise trans il y a un |placeholder- filtre et un |raw- filtre (pour les anciennes versions: |passthrough).

Je ne vois aucune différence dans la sortie en utilisant ces filtres.
Voici mon modèle:

{% 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>

Et voici la sortie:

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

Y a-t-il un filtre qui arrêtera de s'échapper?

2
Philipp Zedler

AFAIK la balise trans Twig trans Drupal 8 a été implémentée pour faciliter les traductions vers des thèmes qui connaissaient déjà Twig.

Sous le capot, il fonctionne avec le même type de chaînes de traduction que la fonction de traduction régulière Drupal t () ou la Drupal Twig filter | t, alors que toutes les variables que vous utilisez dans le bloc trans sont traitées comme @ variable ou % variable espace réservé dans les chaînes de traduction.

Ces espaces réservés dans la fonction de traduction échappent toujours au HTML avant d'être insérés dans la traduction. Peu importe comment vous essayez de ne pas échapper aux valeurs que vous transmettez, sauf que vous passez un objet FormattableMarkup .

Variables non désinfectées ({{ variable|raw }} dans Twig modèles ou !variable dans les chaînes de traduction) est déconseillé pour Drupal 8 traductions et ne fonctionnera pas dans les dernières versions 8.x Drupal. Les API de traduction) description est un peu dépassé.

Pour votre cas d'utilisation, vous pouvez simplement ajouter la balise de lien HTML à votre chaîne de traduction et faire de l'URL du lien lui-même la variable. Malheureusement, la balise Twig trans ne prend pas encore en charge ce type de variable. (Comparez this problème principal.) Vous devez donc utiliser le filtre t à la place:

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

L'exemple ci-dessus correspond aux chaînes de traduction:

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

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

6
Mario Steinitz