Tutorial de i18n y l10n en Django

Carlos Cueto
3 min readApr 6, 2017

--

Durante un proyecto escolar, nos enfrentamos a un requerimiento donde el usuario pudiera escoger el lenguaje de la aplicación. Sin embargo, aún con la documentación provista por Django, no pude encontrar algún otro articulo que lo implementara de manera simple y sencilla o que fuera compatible con la version 1.10+.

En este tutorial les mostrare como utilizar internacionalización y localización en Django 1.10+ desde cero.

Creando una APP

Antes de comenzar, asegurense que tengan Django instalado, si necesitan instrucciones les recomiendo este tutorial que explica cómo instalarlo usando Pip, Virtualenv y Git en Ubuntu.

https://www.howtoforge.com/tutorial/how-to-install-django-on-ubuntu/#step-create-you-first-project-with-django

Para crear el proyecto desde cero, crearemos un directorio llamado “translation_tutorial” con el siguiente comando:

django-admin startproject translation_tutorial

El siguiente paso consiste en crear una app, para efectos de este tutorial, se llamara “languages”, sin embargo, este puede ser reemplazado por la app que estén desarrollando, es decir, no es necesario que creen este folder para trabajar internacionalización, ya que ustedes continuarán los siguientes pasos dentro de su app correspondiente.

python3 manage.py startapp languages

El directorio de trabajo quedará de la siguiente manera:

translation_tutorial/
manage.py
translation_tutorial/
__init__.py
settings.py
urls.py
wsgi.py
languages/
migrations/
__init__.py
admin.py
models.py
tests.py
views.py

Configuración de “settings.py”

Por defecto, Django tiene pre-configurado internacionalización y localización, sin embargo, es mejor asegurarnos que ambas variables estén declaradas como TRUE, dentro del folder “translation_tutorial”, encontraremos un archivo llamado “settings.py”, ahí escribiremos este código:

from django.utils.translation import ugettext_lazy as _INSTALLED_APPS = (
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
(...),
‘languages’,
)
(...)MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
(...)
)
(...)

LANGUAGES = (
(‘en’, _(‘English’)),
(‘es’, _(‘Spanish’)),
(...)
)


LANGUAGE_CODE = 'es'
TIME_ZONE = ‘America/Mexico_City’
USE_I18N = True
USE_L10N = True
USE_TZ = True

Configuración de Templates

Esta vista permite al usuario poder realizar cambios de idioma, lo primero que haremos será modificar el archivo “urls.py” dentro de languages con el siguiente código:

from django.conf.urls import url, include
from . import views

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^i18n/', include('django.conf.urls.i18n')),
]

Una vez realizado ese cambio, toca modificar el archivo “index.html”, creado en la carpeta templates de “languages” (languages/templates/index.html):

{% load i18n %}<h1>{% blocktrans %}Hola{% endblocktrans %}</h1>
<p>{% blocktrans %}Bienvenido al sitio{% endblocktrans %}</p>
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% for lang in LANGUAGES %}
<option value="{{ lang.0 }}" {% if lang.0 == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ lang.1 }} ({{ lang.0 }})
</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>

Despues tendremos que modificar el archivo “views.py” dentro de languages, para poder agregar el procesamiento a POST de la variable set_languague.

from django.shortcuts import render

def index(request):
return render(request, 'languages/index.html')

Creando archivos de traducción

Dentro del folder “languages,” crearemos un directorio llamado “locale” y ejecutaremos el siguiente comando en terminal:

python ../manage.py makemessages -l ‘en’

  • ***RECUERDA ES DENTRO DEL FOLDER “languages”***

Dentro del folder “locale” se generaran los siguientes archivos:

languages/
locale/
en/
LC_MESSAGES/
django.po
migrations/
(...)

Realizando traducciones

Dentro de “django.po”, se encontrarán todos los strings listos para ser traducidos, ya que la variable ugettext() encuentra todas las ocurrencias de trans. Para realizar la traducción, solo llena el campo msgstr:

#: templates/index.html:3
msgid “Hola”
msgstr “Hello”

Después, nos queda compilar los mensajes con este comando:

python ../manage.py compilemessages

  • ***RECUERDA ES DENTRO DEL FOLDER “languages”***

Prueba de vista

SItio en español
Sitio en Ingles

Conclusiones

Como verán i18n y l10n en django es muy fácil de implementar pues la mayoría del trabajo ya esta hecho, lo único que tienes que hacer es configurarlo de manera adecuada y seguir algunos pasos. Como recomendación, siempre utilicen “blocktrans” pues facilita la traducción de de oraciones largas.

NOTA: este tutorial toma como base ciertos archivos de http://joaoventura.net/blog/2016/django-translation/

--

--