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:
Archivo de traducción al inglés:#!/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()
Código:
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.# 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"
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?