makemessages example documentacion django internationalization translation

example - django traduce contenido variable en plantilla



django translation js (8)

Estoy usando la etiqueta de plantilla {% trans%}. Django docs dice:

La etiqueta de plantilla {% trans%} traduce una cadena constante (entre comillas simples o dobles) o contenido variable:

{% trans "Este es el título". %} {% trans myvar%}

https://docs.djangoproject.com/en/1.3/topics/i18n/internationalization/#trans-template-tag

Encontré imposible hacer {% trans myvar%} porque myvar simplemente no aparece en el archivo django.po después de ejecutar el comando makemessages.

¿Lo estoy usando mal? ¿Podría alguien ayudarme con esto?


Django no puede adivinar qué hay en esa variable, por lo que debe traducirlo usted mismo agregando las cadenas en inglés ( msgid ) y localizadas ( msgstr ).


Es una solución elegante y compleja que puede ayudar si está traduciendo valores de campos modelo: http://django-modeltranslation.readthedocs.org

"Traducción de modelos

La aplicación de traducción de modelos se utiliza para traducir el contenido dinámico de los modelos existentes de Django a un número arbitrario de idiomas sin tener que cambiar las clases del modelo original ".


Mi experiencia aquí es que la traducción variable no funciona en las plantillas por sí sola . Sin embargo, llegué a una solución adecuada cuando se conoce el contenido de las variables (quiero decir que no son texto libre, sino un conjunto de opciones que se establecen en la base de datos).

Debe forzar la traducción en la vista o en una etiqueta de filtro.

Para resumir:

  1. Usa blocktrans en tus plantillas
  2. Forzar variables a traducir
    • O bien establece variables en contexto que ya están marcadas para transtalion
    • o usa un filtro para traducirlos
  3. Generar traducciones en archivo .po

La historia es así:

vistas.py

def my_view(request): return render(request, ''i18n_test.html'', {''salutation'':"Hola"})

templates / i18n_test.html

... {% blocktrans %}{{ salutation }}{% endblocktrans %} ...

Y cuando renderizo la plantilla, siempre muestra Hola, sea ​​cual sea el idioma actual.

Para forzar la traducción, en la vista necesitamos usar ugettext.

def my_view(request): return render(request, ''i18n_test.html'', {''salutation'':ugettext("Hola")})

Sin embargo, no siempre es posible acceder a la vista. Así que prefiero usar un filtro como este.

templatetags / i18n_extras.py

@register.filter(name=''translate'') def translate(text): try: return ugettext(text)

Y la plantilla se convierte en.

... {% blocktrans s=salutation|translate %}{{ s }}{% endblocktrans %} ...

Y produce Hola, Hola, Ciao, Salut dependiendo del idioma actual.

La desventaja (como se señala en los docs ) es que makemessages no incluye automáticamente estas traducciones, por lo que necesitamos incluirlas manualmente. En el archivo django.po:

locales / es / django.po

... msgid "Hola" msgstr "Hello" ...


Para mí, esto sucedió cuando tuve las TEMPLATES.DIRS fuera de mi directorio de proyectos de Django. Recuperar las plantillas en el directorio del proyecto resolvió el problema.


Puede traducir la variable en el código de Python como aquí para la settings.SITE_NAME . settings.SITE_NAME :

from django.conf import settings from django.utils.translation import ugettext_lazy as _ def processor004(request): my_dict = { ''site_id004'': settings.SITE_ID, ''site_name004'': _(settings.SITE_NAME), ''installed_apps004'': settings.INSTALLED_APPS, ''embedded_widget004'': settings.EMBEDDED_WIDGET, ''base_template004'': settings.BASE_TEMPLATE, } return my_dict


Puede usar la etiqueta de plantilla blocktrans en este caso:

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}


hacer etiquetas propias

from django.utils.translation import ugettext as _ @register.simple_tag def trans2(tr, *args, **kwargs): # print('':'', kwargs) trans = _(tr) trans_str = trans.format(**kwargs) return trans_str

en plantilla:

{% trans2 columns_once.res_data.message with value=columns_once.res_data.recommend%}

en django.po

#: default_content.py:136 msgid "_audit_recommend_speed" msgstr "Рекомендованная скорость до {value} сек"


{% trans myvar %} simplemente funciona. Así que revise su archivo PO para asegurarse de que el valor de myvar esté en msgstr. PO.

<title>{% trans myvar %}</title>

Por ejemplo, si myvar contiene "Some Publisher" , puede escribir lo siguiente en el archivo PO:

msgid "Some Publisher" msgstr "কিছু প্রকাশক"

También asegúrate de haber corrido:

python manage.py compilemessages