44 votes

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

Dans les modèles Django, vous pouvez utiliser {{ _("Customer") }} ou {% trans "Customer" %}. Dans les docs, les "officiels" approche semble être la {% trans %} balise, alors que l' _() de la syntaxe n'est mentionné une fois.

Comment ces approches diffèrent (à l'exception de la syntaxe) et pourquoi devrait-être un préférable plutôt que les autres?

Une différence est que manifestement, vous ne pouvez pas utiliser {% trans %} avec des étiquettes et des filtres. Mais est-ce à dire que je peux utiliser _() partout, comme {{ _("String") }}? Il fonctionne et semble beaucoup plus propre et plus cohérente que l'utilisation d' {% trans "String" %} autonome avec des chaînes et des _() avec des étiquettes et des filtres.

52voto

Anton Strogonoff Points 6792

Il semble donc qu'il n'y a techniquement aucune différence de Django 1.5. Le moteur de modèle interne de la marque une variable pour la traduction (par l'établissement de ses translate d'attribut) dans deux cas:

  • lorsque vous effectuez {% trans VAR %} (voir TranslateNode), ou
  • si le nom d'une variable commence par _( et se termine par ) (voir Variable.__init__).

Plus tard, lorsque la variable est résolu, Django enveloppe avec ugettext ou pgettext si elle voit l' translate d'attribut.

Cependant, comme on peut le voir à partir du code source, il y a une certaine flexibilité des considérations en faveur de l' {% trans %} balise:

  • vous pouvez le faire {% trans "String" noop %}, ce qui mettra la chaîne de la traduction dans l' .les fichiers po, mais ne sera pas réellement traduire la sortie lors du rendu (pas translate de l'attribut sur la variable, pas de ugettext des appels);
  • vous pouvez spécifier le contexte du message*, comme {% trans "May" context "verb" %};
  • vous pouvez mettre de la traduction du message dans une variable pour l'utiliser plus tard*, comme {% trans "String" as translated_string %}.

* Comme de Django 1.4.

N'hésitez pas à me corriger ou à afficher une meilleure réponse dans le cas où je suis absent quelque chose.

1voto

gagamil Points 91

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X