Foros del Web » Programando para Internet » Python »

[Cerrado] Problema con gettext al estar las cadenas "principales" en UTF-8

Estas en el tema de [Cerrado] Problema con gettext al estar las cadenas "principales" en UTF-8 en el foro de Python en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/05/2010, 04:57
 
Fecha de Ingreso: diciembre-2005
Ubicación: Redondela (Galicia)
Mensajes: 368
Antigüedad: 13 años, 10 meses
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 protected]>, 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 protected]>\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
  #2 (permalink)  
Antiguo 27/05/2010, 10:07
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con gettext al estar las cadenas "principales" en UTF-8

En principio se me ocurre probar si la codificación de los archivos de texto es UTF-8 o no. Si el archivo está codificado en ISO-8859-1 e intentás abrirlo como UTF-8, verás caracteres extraños.


Saludos.
  #3 (permalink)  
Antiguo 27/05/2010, 10:44
 
Fecha de Ingreso: diciembre-2005
Ubicación: Redondela (Galicia)
Mensajes: 368
Antigüedad: 13 años, 10 meses
Puntos: 1
Respuesta: Problema con gettext al estar las cadenas "principales" en UTF-8

Está todo en UTF-8.

Pero creo que voy a cerrar el tema... le pondré "cerrado" en el título o algo, porque seguí investigando y parece que sencillamente no se puede hacer lo que pretendo.

A alguien se le ocurrió la maravillosa idea de simplemente no aceptar UTF-8 como codificación de entrada para gettext y punto... y lo justifican con un par de excusas.

Por si a alguien le interesa o tiene el mismo problema: http://www.gnu.org/software/gettext/...nascii_strings
  #4 (permalink)  
Antiguo 27/05/2010, 12:21
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: [Cerrado] Problema con gettext al estar las cadenas "principales" en UTF-8

Si, ya habías aclarado que estaba todo en UTF-8, disculpa la pregunta que hice antes de leer bien.

El argumento para no utilizar cierto tipo de cadenas en el código fuente es en realidad comprensible, no es una "maravillosa idea" que se le ocurrió a alguien. Supongo que debería estar claro en la documentación y no hacer perder el tiempo cuando uno se cruza con el problema, pero esa ya es otra historia.

De todas formas, ¿ya te vas a rendir? ¡si se te pueden ocurrir varias soluciones!

Solución 1: Escribí los mensajes en inglés (estarás seguro de que no vas a usar caracteres no ASCII) y luego transformá al idioma necesario

Solución 2: Escribí los mensajes en español sin tildes, y luego usá un archivo .mo de gettext para traducir las líneas a español "correcto".


saludos.
  #5 (permalink)  
Antiguo 27/05/2010, 12:40
 
Fecha de Ingreso: diciembre-2005
Ubicación: Redondela (Galicia)
Mensajes: 368
Antigüedad: 13 años, 10 meses
Puntos: 1
Respuesta: [Cerrado] Problema con gettext al estar las cadenas "principales" en UTF-8

xD no no, no me iba a rendir, solo me rindo en el detalle de utilizar caracteres "especiales" en las cadenas del código fuente...

Ya lo tengo todo hecho, y precisamente se me ocurrieron las mismas dos soluciones que me propones —la primera es obvia y me parece la correcta, aunque adopté la segunda porque la aplicación no va a ser traducida al inglés xD.

Gracias por tu tiempo!

Etiquetas: cadenas, gettext, utf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:37.