Hola a todos.
Tengo un problema utilizando Python con PyGTK y gettext, y creo que se dónde está el fallo pero no su porqué ni como solucionarlo.
Resulta que la aplicación debe estar en Español y Gallego, por lo que la hice en Español y posteriormente utilicé los comandos de gettext (xgettext y msgfmt) para extraer las cadenas y traducirlas al Gallego. Hasta aquí todo bien, nunca había utilizago gettext y me sorprendió lo aparentemente fácil que es... pero a la hora de probar la aplicación me percaté de que algunas de las cadenas no se traducían.
Fijándome acabe encontrando el denominador común: Básicamente las cadenas principales (las msgid, osea, las que están en el código fuente) que tienen algún carácter no ASCII no funcionan. Pero NO LO ENTIENDO, y es que el código fuente está en UTF-8, el .po está en UTF-8 y su campo Content-Type es
"Content-Type: text/plain; charset=UTF-8\n"... además, he abierto el .mo con un editor hexadecimal y las cadenas están en UTF-8... así que no entiendo qué es lo que falla con gettext =S
He preparado una prueba de concepto muy simple por si alguien quiere probarlo...
Código Python:
Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gettext
gettext.install('test', './po', unicode = True)
import pygtk
pygtk.require('2.0')
import gtk
class HelloWorld:
def delete_event(self, widget, event, data=None):
print "delete event occurred"
return gtk.FALSE
def destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.set_border_width(10)
self.box = gtk.HBox(0, False)
self.button0 = gtk.Button(_('Hola Mundo'))
self.button0.connect_object("clicked", gtk.Widget.destroy, self.window)
self.button1 = gtk.Button(_('Holá Mundo'))
self.button1.connect_object("clicked", gtk.Widget.destroy, self.window)
self.box.pack_start(self.button0, False, False, 0)
self.box.pack_start(self.button1, False, False, 0)
self.window.add(self.box)
self.window.show_all()
def main(self):
gtk.main()
hello = HelloWorld()
hello.main()
Archivo de traducción al inglés:
Código:
# 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: 2010-05-27 08:25+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../../test.py:7
msgid "Hola Mundo"
msgstr "Hello World"
#: ../../test.py:8
msgid "Holá Mundo"
msgstr "Hello"
Este archivo deberá llamarse test.po y deberá estar situado en
[carpeta donde está el ejecutable anterior, escrito en Python]/po/en_US/LC_MESSAGES/, luego bastará con ejecutar
msgfmt ./test.po -o ./test.mo para crear el binario que utilizará la aplicación.
Al ejecutarlo normalmente aparecen los dos botones con su texto en español... pero definiendo la variable de entorno LANGUAGE a
en_US (o LANG a
en_US.utf8) solo uno de los dos botones aparece traducido... el que no tiene el carácter acentuado en la cadena original.
¿Se os ocurre dónde puede estar el problema?