Cómo hacer que Glade cargue traducciones desde / opt

9

He creado una aplicación que me gustaría enviar a través del proceso de desarrollo de aplicaciones de Ubuntu . Uno de los requisitos para el proceso es que, cuando se instalan, todos los archivos van al /opt/extras.ubuntu.com/<appname>directorio.

A través de cambios en el empaque y con la ayuda de otros, lo he logrado, pero ahora me enfrento a un nuevo problema: cuando se ejecuta desde /optlas traducciones de mi aplicación no se están cargando.

Lo que sucede es lo siguiente: a menos que se especifique lo contrario, los archivos binarios (archivos MO) que contienen traducciones para una aplicación se cargan desde /usr/share/locale(o en el caso de Ubuntu, desde /usr/share/locale-langpack), pero en mi aplicación, debido al /optrequisito, se instalan en /opt/extras.ubuntu.com/qreator/locale.

En teoría, eso está bien, ya que gettext permite especificar una ubicación alternativa para cargar traducciones, así que agrego la bindtextdomainllamada para lograr eso:

import gettext
from gettext import gettext as _
gettext.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
gettext.textdomain('qreator')

Eso funciona bien hasta cierto punto: todos los mensajes que salen en la línea de comando aparecen traducidos como se esperaba. Pero no resuelve el problema principal : cargar las traducciones de la IU Glade requiere especificar el dominio de traducción una vez más (el equivalente a la gettext.textdomain('qreator')llamada anterior), pero no permite especificar desde dónde cargar las traducciones (es decir, el equivalente de Glade a bindtextdomain, que lamentablemente no existe). Aquí hay un extracto del código que estoy usando:

builder = Gtk.Builder()
builder.set_translation_domain('qreator')
# There isn't a way to tell glade to load translations from
# somewhere else than /usr/share/locale here
builder.add_from_file(ui_filename)

Esto significa esencialmente que las traducciones de la interfaz de usuario no se pueden cargar si su aplicación está instalada /opt.

Estoy bastante atrapado en este punto. ¿Alguna idea sobre cómo hacer que Glade cargue traducciones en /opt/extras.ubuntu.com/qreator/share/locale/lugar de /usr/share/locale?

David Planella
fuente
Después de hablar con alguien más conocedor de Gtk.Builder, presenté un error: bugzilla.gnome.org/show_bug.cgi?id=676543
David Planella
También me han indicado una solución, pero no pareció funcionar para mí, aquí está: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella
¿Podría incluir un ejemplo ejecutable mínimo completo en su código de Python? Estoy feliz de profundizar en esto, pero no estoy seguro de qué importaciones me faltan para obtener un Gtk.Builder ().
slangasek
n / m, aparentemente eso es solo 'import gtk';)
slangasek
1
correcto - Me rindo, parece que no hay una forma sensata de obtener gettext.bindtextdomain () para apoderarse de glade: /
slangasek

Respuestas:

10

He encontrado una solución: use el módulo de configuración regional de Python en lugar de gettext

import locale
from locale import gettext as _
locale.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
locale.textdomain('qreator')

Gracias a Juha Sahakangas en el canal # gtk + IRC por proporcionar la explicación:

Para este caso particular, se debe usar el módulo de configuración regional en lugar de gettext . El módulo gettext de Python es Python puro, en realidad no establece el dominio de texto de una manera que la biblioteca C pueda leer, pero la configuración regional sí (llamando a libc). Mientras eso esté hecho, GtkBuilder ya funciona de la manera que usted lo solicita.

David Planella
fuente