CÓMO USAR EL SISTEMA DE TRADUCCIONES EN DJANGO (I18N)

in #utopian-io7 years ago

This tutorial is a simple guide to explain to the community of programmers how to use Django Translation. I hope this tutorial can be useful to the whole community. The importance of the Internationalization is that we can show our websites to the final user in different languages. When we are designing a website some times we want that many users in different countries around the world can view our website. The Internationalization works so good for static websites due to the simplicity of the Django's tool.

La importancia de la internacionalización, radica en la necesidad de mostrar el contenido web en el idioma del usuario final. Al diseñar una aplicación web, a veces se pretende llegar a diferentes usuarios, localizados en diferentes partes del mundo, cuyo idioma es absolutamente diferente al idioma nativo, en el cual fue desarrollado la aplicación. La internacionalización, es generalmente usada en páginas web estáticas, debido a la simplicidad de la herramienta desarrollada en el framework web Django. Hay dos conceptos importantes en la traducción Django: internacionalización y localización. Internacionalización se refiere al proceso de diseño de programas para el uso potencial de cualquier lugar [DR1]. Internacionalización es comúnmente abreviada como I18N, donde 18 es el número de letras que se encuentran entre la I y la N. Localización se refiere al proceso especifico de traducir un programa internacionalizado, para su uso en un lugar particular. Localización es comúnmente abreviada como L10N, donde al igual que en internacionalización, 10 representan el número de letras omitidas entre la L y la N [DR1].

MODIFICACIÓN EN EL SETTING.PY

En el archivo settings.py, es necesario realizar algunas configuraciones, antes de disponer de la función de traducción. Lo primero que se debe hacer, es garantizar que se tenga activada la traducción para el proyecto. De acuerdo a lo anterior, es necesario ubicar en el archivo settings.py el apartado MIDDLEWARE. En este apartado se debe agregar la línea de código:

django.middleware.locale.LocaleMiddleware

La línea anterior asegura que se tenga activada la función de traducción para el proyecto. A continuación del apartado DATABASES se deben incluir las siguientes líneas de código:

LANGUAGE_CODE = 'es'
USE_I18N = True
USE_L10N = True

La primer línea LANGUAGE_CODE hace referencia al idioma en el cual está escrito la página o aplicación web, que para este ejemplo en particular es el idioma español. Las líneas USE_I18N y USE_L10N al estar en True indican que se tienen activadas las funciones de Internacionalización y localización respectivamente.

Los archivos de traducción, serán almacenados en una carpeta, por lo cual es necesario indicarle a Django el directorio en el cual se encontrarán localizados estos archivos. La siguientes líneas de código deben ser incluida en el archivo settings.py para indicar el directorio en el que estará la carpeta de traducciones:

LOCALE_PATHS = (os.path.join (BASE_DIR, 'locale/'))

La anterior línea de código en el archivo settings.py le indicara a Django que los archivos de traducción, se guardaran en la carpeta locale, que está en la raíz del proyecto.

Para un proyecto determinado, se pueden realizar una o más traducciones. En el archivo settings.py se debe incluir una tupla que contendrá los idiomas en los cuales se van a realizar las traducciones. Las siguientes líneas de código, permiten agregar esta tupla al proyecto:

LANGUAGES = [
....('sp', _('Spanish')),
....('en', _('English')),
]

Las líneas de código anteriores indican que el proyecto va a contener los idiomas Inglés y Español. De esta manera se pueden agregar todos los idiomas que se quieran al proyecto. La línea de código ‘sp’, _(‘Spanish’) indica que para el idioma Español su código es ‘sp’, mientras que para el idioma inglés es ‘en’. Los puntos indican la identación correspondiente a espacios; es decir que en las líneas anteriores, y en el resto del tutorial, cada punto se debe interpretar como un espacio. Se debe importar al inicio del archivo settings.py, la función ugettext. La siguiente línea de código permite importar esta función:

from django.utils.translation import ugettext as _

INTERNACIONALIZACIÓN EN PYTHON

Para indicarle a Django que una cadena de texto en Python debe ser traducida es necesario usar la función ugettext, la cual puede ser llamada por su alias _(). En el siguiente ejemplo se puede observar lo anterior:

from django.utils.translation import ugettext as _

messages.success(self.request, _(‘Estudiante creado correctamente’))

En la primera línea se está importando la función ugettext de la librería translation de Django, mientras que en la línea _('Estudiante creado correctamente’), se le está diciendo a Django que esa cadena de texto Python debe ser traducida.

PLURALIZACIÓN

Al realizar la traducción de algún idioma puede suceder que la forma plural sea distinta a solamente agregar una ‘s’ al final de la palabra que se desea pluralizar. Debido a lo anterior, Django incluye una función que permite incluir mensajes cuya forma plural es distinta a agregarle una ‘s’ al final de la palabra en singular. En el siguiente ejemplo se indica lo anterior:

from django.utils.translation import ngettext
from django.http import HttpResponse

def function_proof(request, count):
....page = ngettext(
........‘there was %(count)d object’,
........‘there were %(count)d objects’,
....count) % {
........‘count’: count,
}
`return HttpResponse(page)``

INTERNACIONALIZACIÓN EN HTML

En html se usa la etiqueta {% trans %} para indicarle a Django que una cadena debe ser traducida. En el siguiente ejemplo se puede observar lo anterior:

{% load i18n %}

<h5>{% trans "¿Nuestro objetivo?" %}</h5>
<h3>{% trans "Transformar sueños en líneas de código inteligente." %}</h3>

Esta etiqueta no admite el uso de variables de plantillas. Por lo tanto si se requiere el uso de variables se debe utilizar la etiqueta {% blocktrans %}, como se puede observar en el ejemplo a continuación:

{% load i18n %}

<p>{% blocktrans %} Entrada escrita por: {{ entry.created_by|safe }} {% endblocktrans %}</p>

Es importante tener en cuenta que Django no realiza la traducción de ningún texto, a ningún idioma, es decir que esta es responsabilidad es netamente del programador. Por lo cual, una vez que se han realizado todas las indicaciones tanto en Python como en HTML se deben crear los archivos de idioma, los cuales son los que le indican a Django las traducciones posibles de una cadena de texto.

INTERNACIONALIZACIÓN EN JAVA SCRIPT

La internacionalización en JavaScript se hace por medio del catálogo de traducciones de JavaScript. Para usar el catálogo se debe hacer:

<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>

Con esta línea de código se obtiene el catálogo de traducciones desde el servidor. Este catálogo permite usar la interfaz estándar gettext para realizar la traducción del código JavaScript. Para indicarle al proyecto que un texto JavaScript debe ser traducido, se procede como en el siguiente ejemplo:

document.write(gettext(‘Este campo es requerido’));

La pluralización en JavaScript se hace por medio de la función ngettext:

var object_count = 1

s = ngettext('there was', 'there were', object_count);

INSTALACIÓN DE LIBRERÍA GETTEXT

Antes de crear los archivos de idioma es necesario tener instalado en el proyecto la librería Gettext. De lo contrario aparecerá el siguiente error al correr el comando de generación de mensajes:

CommandError: can’t find msgfmt. Make sure you have GNU gettext tolos 0.15 or newer installed.

GENERACIÓN Y COMPILACIÓN DE ARCHIVOS DE MENSAJES

Como se indicaba anteriormente, Django no realiza la traducción de ningún texto, por lo cual el programador debe indicar por medio de un mensaje la traducción correspondiente de un texto, en un idioma determinado. Debido a lo anterior se debe hacer la compilación de mensajes para HTML y Python con:

python manage.py makemessages -l sp

Mientras que para JavaScript se deben realizar con:

python manage.py makemessages -d djangojs -l sp

La anterior línea de código genera un archivo .po, el cual es un archivo de mensajes que contiene todos las cadenas de texto que deben ser traducidas, de los archivos HTML y Python. En la línea de código anterior, sp indica referencia a los mensajes del idioma español. Este archivo .po es único por cada idioma a incluir. Al abrir este archivo se pueden encontrar los mensajes a ser traducidos:

msgid "Agregar servicio"
msgstr ""

msgid indica la cadena de caracteres que debe ser traducida, mientras que msgstr indica la traducción de la cadena de caracteres, la cual es ingresada por el programador. Es decir, que para la cadena anterior, el archivo lucirá así, cuando el programador ingrese la cadena de traducción:

msgid "Agregar servicio"
msgstr "Add service"

Si se quiere ingresar una traducción de caracteres que incluya más de una línea, se debe hacer:

msgid ""
"La contraseña debe tener al menos una letra y un número. Los caracteres "
"no pueden ser todos iguales"
msgstr ""
"The password must have at least one letter and a number. The characters "
"can not all be the same"

La compilación de los mensajes se debe hacer con:

python manage.py compilemessages

Esta compilación genera un archivo binario con extensión .mo.

USO DE LOS IDIOMAS DISPONIBLES

La vista de redirección de Django se activa incluyendo en el archivo urls.py:

url('i18n/', include('django.conf.urls.i18n'))

Esta vista coloca la preferencia del idioma del usuario y lo redirige a una URL determinada, o lo regresa a la página anterior, por defecto.

Para el uso de cada uno de los idiomas disponibles, por los usuarios que visiten la página, se puede agregar un botón en la vista principal, por cada uno de los idiomas disponibles:

{% get_language_info_list for LANGUAGES as languages %}

{% for l in languages %}
....<button title=”{{ l.name_local |title}}” name=”language” type=”submit” class=”btn-floating”
....value=”{{ l.code }}”>{{ l.code | upper }}</button>
{% for %}

La función get_language_info_list obtiene la lista de idiomas disponibles del proyecto, mientras que las demás líneas crean un botón por cada idioma disponible, para que el usuario pueda seleccionar el idioma, en el cual quiere ver los contenidos de la página.

Este tutorial se realizó con la intención de que fuera lo más simple posible, tanto conceptualmente como procedimentalmente, para que quien lo aborde pueda hacer uso de la función de traducción de Django. Espero le sea útil a toda la comunidad.

DOCUMENTOS DE REFERENCIA

[DR1] El Libro de Django, J. Kaplan, A. Holovaty, 2008.



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Hey @mateo.vergara I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • This is your first accepted contribution here in Utopian. Welcome!

Suggestions

  • Contribute more often to get higher and higher rewards. I wish to see you often!
  • Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!

Get Noticed!

  • Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x

Congratulations @mateo.vergara! You received a personal award!

1 Year on Steemit

Click here to view your Board of Honor

Support SteemitBoard's project! Vote for its witness and get one more award!

Congratulations @mateo.vergara! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!