Julio-10-2007
Filed Under (Python) by Pedro Guridi

Si tienes programas realizados en Python/Glade, puede ser útil internacionalizarlos, el texto de los menús/mensajes/botones, etc, se mostrará en el idioma definido en el sistema.

Herramientas utilizadas:

  • PyGtk
  • Glade
  • Python 2.3
  • GNU gettext
  • Gtk+ 2.4.1
  • Libglade 2.4.0

Extrayendo los mensajes de Glade:

Necesitarás de intltool, una utilidad para internacionalizar documentos en XML. Si usas Debian alcanza con teclear:

apt-get install intltool

El programa intltool-extract extrae las cadenas de texto de un archivo glade (en el ejemplo “miprograma.glade”) y genera un archivo .h (en el ejemplo “miprograma.h”):

intltool-extract --type="gettext/glade" miprograma.glade

 

No se necesita editar el archivo .h, será leido por xgettext.

Generando archivo de traducción:

xgettext -k_ -kN_ -o mensajes.pot *.py *.h

Creará un archivo de traducción “mensajes.pot” a partir de los codigos fuente python y de los archivos .h generados por intltool-extract

Creando archivos de traducción:

Para que sea posible crear traducciones para diferentes idiomas es necesario crear un archivo para cada una. Para esto se utiliza msginit.

En este ejemplo msginit crea el archivo es_ES.po adecuado para la traduccion al español:

msginit -i mensajes.pot -l es_ES

Una vez traducido el archivo es_ES.po es necesario generar el archivo que será utilizado por el programa:

msgfmt es_ES.po -o po/pt/LC_MESSAGES/miprograma.mo


No importa el nombre del directorio donde se coloque el archivo *.mo, pero la estructura del directorio tiene que ser <directorio>/<locale>/LC_MESSAGES/<nombre-de-programa>.mo. Donde <locale> es algo como es o es_ES.

Hacer que el programa reconozca las traducciones :

Tipicamente un programa de python usando libglade tendrá strings para ser traducidas tanto en el programa python como en el arquivo glade. Para lidiar con los strings en las fuentes python se puede usar el módulo gettext. Todos los strings a ser traducidas deven usar el método gettext de ese módulo:

 print gettext.gettext("Texto a ser traducido")

Es mucho mas práctico usar el formato _(<string>), pero para eso se debe definir _ como gettext.gettext:

 _ = gettext.gettextprint _("Texto a ser traducido")

Normalmente los archivos con mensajes de traducción van en “/usr/share/locale”, pero mientras tanto este desarrollando su programa es bastante útil tenerlos en un directorio local, algo como “i18n” o “po”:

APP=‘miprograma’

DIR=‘po’

Un ejemplo mas completo sería:

import gettext
 
APP='miprograma'
DIR='po'
 
gettext.bindtextdomain(APP, DIR)
gettext.textdomain(APP)
 
_ = gettext.gettext
 
gtk.glade.bindtextdomain(APP, DIR)
gtk.glade.textdomain(APP)
 
gui = gtk.glade.XML("miprograma.glade")
.....

Del original en portugues

[?]
Share This


Comments
Kopfgeldjaeger on Octubre 16th, 2007 at 4:38 pm #

Yay! Thanks a bunch for your code! I do not really understand what you write (I am German), but your gave helped me much! Thaaanks!

Sambrista on Febrero 25th, 2008 at 12:20 pm #

¡Muchas gracias! Recién estoy empezando con esto de python + glade y no sabia como internacionalizar.

Por cierto la linea:
msgfmt es_ES.po -o po/pt/LC_MESSAGES/miprograma.mo
por seguir con el ejemplo, debería ser:
msgfmt es_ES.po -o po/es_ES/LC_MESSAGES/miprograma.mo

Un saludo

Sambrista on Febrero 29th, 2008 at 9:14 am #

Falta un detalle. Para que funcionen los textos escritos en el .py (no en glade) hay que añadir estas dos lineas:
gettext.bindtextdomain(APP, DIR)
gettext.textdomain(APP)

gmolleda on Septiembre 14th, 2008 at 3:51 am #

Muchas gracias, he encontrado un fallito, falta separar en dos líneas:
_ = gettext.gettextprint _(”Texto a ser traducido”)
Debe ser:
_ = gettext.gettextprint
_(”Texto a ser traducido”)

Saludos

gmolleda on Septiembre 14th, 2008 at 3:52 am #

Yo sí que fallo, las líneas eran:
_ = gettext.gettext
print _(”Texto a ser traducido”)

Post a comment
Name: 
Email: 
URL: 
Comments: