Dans les modèles Django, vous pouvez utiliser {{ _("Hello World") }}
ou {% trans "Hello World" %}
Pour marquer les chaînes à traduire. Dans les documents, l'approche "officielle" semble être la {% trans %}
tag, mais la syntaxe _()
est également mentionnée ne fois .
En quoi ces approches diffèrent (sauf la syntaxe) et pourquoi devrait-on préférer l'une plutôt que l'autre?
Une différence est que vous ne pouvez évidemment pas utiliser {% trans %}
Avec des balises et des filtres. Mais cela signifie-t-il que je peux simplement utiliser _()
partout, comme {{ _("String") }}
? Cela fonctionne et semble beaucoup plus propre et plus cohérent que d'utiliser {% trans "String" %}
Avec des chaînes autonomes et _()
avec des balises et des filtres.
Il semble donc qu'il n'y ait techniquement aucune différence à partir de Django 1.5. Le moteur de modèle marque en interne une variable à traduire (en définissant son attribut translate
) dans deux cas:
{% trans VAR %}
(voir TranslateNode
), ou_(
et se termine par )
(voir Variable.__init__
).Plus tard, lorsque la variable est résolue , Django l'enveloppe avec ugettext
ou pgettext
s'il voit le translate
attribut.
Cependant, comme le montre le code source, il existe certaines considérations de flexibilité en faveur de {% trans %}
tag:
{% trans "String" noop %}
, qui mettra la chaîne à traduire dans des fichiers .po, mais ne traduira pas réellement la sortie lors du rendu (pas d'attribut interne translate
sur la variable, pas d'appel ugettext
);{% trans "May" context "verb" %}
;{% trans "String" as translated_string %}
.* À partir de Django 1.4.
N'hésitez pas à me corriger ou à poster une meilleure réponse au cas où je manquerais quelque chose.
La balise de modèle trans appelle la fonction ugettext () . Dans Django _ () est un alias pour ugettext () . Ceci est couvert dans les Django docs .