Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/05/2010, 04:57
Sanva
 
Fecha de Ingreso: diciembre-2005
Ubicación: Redondela (Galicia)
Mensajes: 368
Antigüedad: 19 años
Puntos: 1
[Cerrado] Problema con gettext al estar las cadenas "principales" en UTF-8

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?

Última edición por Sanva; 27/05/2010 a las 10:45 Razón: Sin solución