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:
- Usa
blocktrans
en tus plantillas - Forzar variables a traducir
- O bien establece variables en contexto que ya están marcadas para transtalion
- o usa un filtro para traducirlos
- 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