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


CategoryDocumentacionTecnica

Internacionalizacion_en_Python (last edited 2008-04-20 14:38:58 by localhost)