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 detranslate
interno en la variable, no hayugettext
llamada 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 .