El libro de Django 1.0

18.2. Especificando cadenas de traducción en código de plantillas

Las traducciones en las plantillas Django usan dos etiquetas de plantilla y una sintaxis ligeramente diferente a la del código Python. Para que tus plantillas puedan acceder a esas etiquetas coloca {% load i18n %} al principio de tu plantilla.

La etiqueta de plantilla {% trans %} marca una cadena para su traducción:

<title>{% trans "This is the title." %}</title>

Si solo deseas marcar un valor para traducción pero para traducción posterior, usa la opción noop:

<title>{% trans "value" noop %}</title>

No es posible usar variables de plantilla en {% trans %} — solo están permitidas cadenas constantes, rodeadas de comillas simples o dobles. Si tu traducción requiere variables (marcadores de posición) puedes usar por ejemplo {% blocktrans %}:

{% blocktrans %}This will have {{ value }} inside.{% endblocktrans %}

Para traducir una expresión de plantilla — por ejemplo, cuando usas filtros de plantillas — necesitas asociar la expresión a una variable local que será la que se usará dentro del bloque de traducción:

{% blocktrans with value|filter as myvar %}
  This will have {{ myvar }} inside.
{% endblocktrans %}

Si necesitas asociar más de una expresión dentro de una etiqueta blocktrans, separa las partes con and:

{% blocktrans with book|title as book_t and author|title as author_t %}
  This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}

Para pluralizar, especifica tanto la forma singular como la plural con la etiqueta {% plural %} la cual aparece dentro de {% blocktrans %} y {% endblocktrans %}, por ejemplo:

{% blocktrans count list|length as counter %}
  There is only one {{ name }} object.
{% plural %}
  There are {{ counter }} {{ name }} objects.
{% endblocktrans %}

Internamente, todas las traducciones en bloque y en línea usan las llamadas apropiadas a gettext/ngettext.

Cuando usas RequestContext (ver Capítulo 10), tus plantillas tienen acceso a tres variables específicas relacionadas con la traducción:

  • {{ LANGUAGES }} es una lista de tuplas en las cuales el primer elemento es el código de idioma y el segundo es el nombre y escrito usando el mismo).
  • {{ LANGUAGE_CODE }} es el idioma preferido del usuario actual, expresado como una cadena (por ejemplo en-us). (Consulta la sección "Cómo descubre Django la preferencia de idioma_" para información adicional).
  • {{ LANGUAGE_BIDI }} es el sistema de escritura del idioma actual. Si el valor es True, se trata de un idioma derecha-a-izquierda (por ejemplo hebreo, árabe). Si el valor es False, se trata de de un idioma izquierda-a-derecha (por ejemplo inglés, francés, alemán).

Puedes también cargar los siguientes valores usando etiquetas de plantilla:

{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}

También existen hooks de traducción que están disponibles en el interior de cualquier etiqueta de bloque de plantilla que acepte cadenas constantes. En dichos casos basta con que uses la sintaxis _() para especificar una cadena de traducción, por ejemplo:

{% some_special_tag _("Page not found") value|yesno:_("yes,no") %}

En este caso tanto la etiqueta como el filtro verán la cadena ya traducida (en otras palabras la cadena es traducida antes de ser pasada a las funciones de manejo de etiquetas), de manera que no necesitan estar preparadas para manejar traducción.