Internacionalizacion en Python
Internacionalizacion de una aplicacion ya escrita
Como yo soy perezoso el programa que internacionalizaremos sera el hello world:
print ("Hello")
Gettext
gettext es el modulo que nos provee acceso a la API gettext la cual es hecha por la gente del proyecto GNU para internacionalizar aplicaciones, y luego de usarla nuestro programa quedaría así:
import gettext
gettext.bindtextdomain('hello', 'locale/')
gettext.textdomain('hello')
print (gettext.gettext("Hello"))Las llamada a bindtextdomain y textdomain harán que nuestro programa al ejecutarse busque el archivo locale/idioma/LC_MESSAGES/hello.mo y saque de allí la traducción
Con esto ya se acabaría el trabajo del programador pero como pueden ver:
$ python hello.py Hello
El trabajo del traductor apenas empieza
Traducción
Como yo soy colombiano traduciré la aplicación al español de Colombia, lo primero sera extraer todas las cadenas de texto que se pasan como parámetro a gettext.gettext
$ xgettext --from-code=UTF-8 hello.py -o es_CO.po
El anterior comando creara el archivo es_CO.po:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-09-19 13:05-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: hello.py:5 msgid "Hello" msgstr ""
Edicion de el archivo.po
Cambia charset=CHARSET a charset=UTF-8 y
msgid "Hello" msgstr ""
por
msgid "Hello" msgstr "Hola"
de forma que el archivo quede asi:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-09-19 13:05-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: hello.py:5 msgid "Hello" msgstr "Hola"
y por ultimo ejecuta:
$ mkdir -p locale/es_CO/LC_MESSAGES/ $ msgfmt es_CO.po -o locale/es_CO/LC_MESSAGES/hello.mo
Ejecución
Hace un rato nombre el archivo locale/idioma/LC_MESSAGES/hello.mo pero lo que no les dije es que idioma se basa en el valor de la variable de entorno LANG, para ver el valor de LANG podemos ejecutar el comando
$ echo $LANG C
C significa que se usaran las cadenas de texto originales y no las traducciones.
Así que lo cambiamos por es_CO para que use las traducción para el español de Colombia:
$ LANG=es_CO $ ./hello.py Hola
Y nuestra aplicación por fin esta traducida
Pero este no es el fin del tutorial, por que en este preciso momento el programador acaba de liberar la versión 2.0 del hello world.
Actualización de la traducción
La versión 2.0 incluye la nueva cadena de texto World la cual debemos traducir.
import gettext
gettext.bindtextdomain('hello', 'locale/')
gettext.textdomain('hello')
print (gettext.gettext("Hello"))
print (gettext.gettext("World"))lo primero es actualizar es_CO.po:
$ xgettext --from-code=UTF-8 hello.py -o es_CO.po -j
le cambiamos charset=CHARSET a charset=UTF-8 y
msgid "World" msgstr ""
por
msgid "World" msgstr "Mundo"
de forma que el archivo quede así:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2005-09-19 13:05-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: hello.py:5 msgid "Hello" msgstr "Hola" #: hello.py:6 msgid "World" msgstr "Mundo"
lo compilamos:
$ msgfmt es_CO.po -o locale/es_CO/LC_MESSAGES/hello.mo
y la traducción de la versión 2.0 esta lista para que la veamos:
$ ./hello.py Hola Mundo
y si se quiere ver en el idioma original:
$LANG=C ./hello.py Hello World
Mas informacion
- La documentacion sobre el modulo gettext
- El manual del comando locale
- Pagina oficial de gettext
