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




trans tag django (2)

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

Plus tard, lorsque la variable est en cours de resolved , Django l’enveloppe avec ugettext ou pgettext s’il voit l’attribut translate .

Cependant, comme on peut le voir dans le code source, il y a quelques considérations de flexibilité en faveur de la balise {% trans %} :

  • vous pouvez faire {% trans "String" noop %} , qui mettra la chaîne à traduire en fichiers .po, mais ne traduira pas la sortie lors du rendu (aucun attribut interne de translate sur la variable, aucun 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.

S'il vous plaît, n'hésitez pas à me corriger ou à poster une meilleure réponse au cas où je manque quelque chose.

Dans les modèles Django, vous pouvez utiliser {{ _("Hello World") }} ou {% trans "Hello World" %} pour marquer les chaînes à traduire. Dans la documentation, l'approche "officielle" semble être la balise {% trans %} , mais la syntaxe _() est également mentionnée une once .

Comment ces approches diffèrent-elles (sauf la syntaxe) et pourquoi devrait-on privilégier 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 cohérent que d'utiliser {% trans "String" %} avec des chaînes autonomes et _() avec des balises et des filtres.


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 .







translation