makemessages i18n example django internationalization django-templates translation

i18n - _() o{% trans%} en plantillas de Django?



django translation (2)

En las plantillas de Django, puede usar {{ _("Hello World") }} o {% trans "Hello World" %} para marcar las cadenas que se traducirán. En los documentos, el enfoque "oficial" parece ser la etiqueta {% trans %} , pero la sintaxis _() se menciona una once .

¿Cómo difieren estos enfoques (excepto la sintaxis) y por qué debería ser uno preferible en lugar del otro?

Una diferencia es que obviamente no puede usar {% trans %} con etiquetas y filtros. ¿Pero eso significa que puedo usar _() todas partes, como {{ _("String") }} ? Funciona y se ve mucho más limpio y más consistente que usar {% trans "String" %} con cadenas independientes y _() con etiquetas y filtros.


Así que parece que técnicamente no hay diferencia a partir de Django 1.5. El motor de plantillas marca internamente una variable para traducción (estableciendo su atributo de translate ) en dos casos:

Más tarde, cuando la variable se está resolved , Django lo envuelve con ugettext o pgettext si ve el atributo translate .

Sin embargo, como puede verse en el código fuente, hay algunas consideraciones de flexibilidad a favor de la etiqueta {% trans %} :

  • puede hacer {% trans "String" noop %} , que colocará la cadena para la traducción en archivos .po, pero no traducirá realmente la salida al renderizar (no hay atributo de translate interno en la variable, no hay ugettext llamada de ugettext );
  • puede especificar el contexto del mensaje * , como {% trans "May" context "verb" %} ;
  • puede poner el mensaje traducido en una variable para su uso posterior * , como {% trans "String" as translated_string %} .

* A partir de Django 1.4.

Por favor, siéntase libre de corregirme o publicar una mejor respuesta en caso de que me esté perdiendo algo.


La etiqueta trans template llama a la función ugettext () . En Django _ () es un alias de ugettext () . Esto está cubierto en los documentos de django .