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:
- cuando hace
{% trans VAR %}(veaTranslateNode), o - si el nombre de una variable comienza con
_(y termina con)(veaVariable.__init__).
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 detranslateinterno en la variable, no hayugettextllamada deugettext); - 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 .