Cómo traducir sitios web con Internacionalización en Django

Inicio / Cómo traducir sitios web con Internacionalización en Django

Autor: alexzamora

27 de Mayo de 2017


En este articulo voy a compartir una breve introducción de como utilizar las funciones de internacionalización de Django para traducir sitios web.

Configuración del SETTINGS.PY

Primero que nada tenemos que decirle a Django que idiomas vamos a soportar, el idioma predeterminado y donde buscar los archivos de traducción que ofrecemos.

Importamos ugettext_lazy

from django.utils.translation import ugettext_lazy as _


Agregamos LocalMiddleware después de SessionMiddleware y antes de CommonMiddleware.

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
)


Listamos los idiomas soportados:

LANGUAGES = (
    ('es', _('Espanish')),
    ('en', _('English')),
)


Establecer el idioma predeterminado para el sitio:

LANGUAGE_CODE = 'es'


Definimos la ruta en donde estarán los archivos de traducción del proyecto:

LOCALE_PATHS = (
    os.path.join(BASE_DIR, "locale"),
)


Django proporciona dos template tags i18n para traducir las partes del html que deseemos.

trans y blocktrans

Veamos como se implementan:

Agregamos la etiqueta  {% load i18n%} en la parte de arriba de cada template que necesitemos traducir.

{% load i18n%} 
{% trans 'Iniciar sesión'%} 
{% trans 'Inicio'%}
{% trans 'Productos'%}
{% trans 'Contacto'%}


Una vez que hemos envuelto el texto en las etiquetas "
trans", crearemos los archivos de traducción desde la terminal de comandos

> python manage.py makemessages -l 'en'


Esto encontrará todos los lugares en su proyecto donde la traducción se pueda llevar acabo, y posteriormente creara un archivo .po dentro de la carpeta locale

mysite/
locale/
en/
LOCALE_MESSAGES/
django.po


Veamos que contiene el archivo .po necesitamos remplazar cada msgstr con la trauducción correspondiente como pueden ver a continuación

#: templates/home/base.html:51
msgid "Noticias"
msgstr "News"


Compilar las traducciones

Necesitamos compilar el archivo .po en .mo, abrimos nuevamente la linea de comandos y ejecutamos lo siguiente.

> python manage.py compilemessages

Ahora debería ver un archivo  .mo  al lado de su archivo .po


Ahora vamos agregar el laguaje code en el archivo general urls.py  para que nuestra url luzca de la siguiente manera:  mysite.com/es/ ó mysite.com/en/

from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext as _

urlpatterns = i18n_patterns(
    url(_(r'contacto/'), include('mysite.apps.contacto.urls', namespace='contacto_app')),
)


Agregamos los botones "es | en" para cambiar fácilmente de idiomas en el template "base.html"

{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
  {% for language in languages %}
    
      {{ language.code }}
    
  {% endfor %}


Al dar clic sobre cualquier idioma, django nos va redireccionar a la url de inicio, pero si nosotros queremos que se traduzca el sitio en la url actual en donde estamos ubicados, ejemplo: mysite.com/es/contacto/ necesitamos el siguiente código

{% get_available_languages as languages %}

{% for lang_code, lang_name in languages %}
    {% language lang_code %}
    <a href="{% url 'contacto_app:contacto' %}">
	{{lang_code }}
    </a>
    {% endlanguage %}
{% endfor %}


Previamente a esto necesitamos ingresar la traducción correspondiente de nuestra url en el archivo .po como lo muestro a continuación

#: mysite/urls.py:25
msgid "contacto/"
msgstr "contact/"


Este comando también lo pueden utlizar.

django-admin.py makemessages --all   


Nota: 

Para traducir toda la información estática de nuestros templates utilizamos el método anterior que trae por default Django pero para traducir el contenido dinámico de los modelos necesitamos una librería externa llamada Django Parler. En el próximo articulo escribiré como implementarla.

Espero sea de utilidad para la comunidad, con gusto comparto mi primer articulo sobre Django :)


Zuma Digital