web-dev-qa-db-fra.com

_ () ​​ou {% trans%} dans les modèles Django?

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.

44
Anton Strogonoff

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:

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:

  • tu peux faire {% 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);
  • vous pouvez spécifier le contexte du message*, comme {% trans "May" context "verb" %};
  • vous pouvez mettre le message traduit dans une variable pour une utilisation ultérieure*, comme {% 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.

52
Anton Strogonoff

La balise de modèle trans appelle la fonction ugettext () . Dans Django _ () est un alias pour ugettext () . Ceci est couvert dans les Django docs .

1
gagamil