Como fazer o Glade carregar traduções de / opt

9

Criei um aplicativo que gostaria de enviar através do processo de desenvolvedor de aplicativos Ubuntu . Um dos requisitos para o processo é que, quando instalados, todos os arquivos entram no /opt/extras.ubuntu.com/<appname>diretório.

Através de alterações na embalagem e com a ajuda de outras pessoas, consegui isso, mas agora estou enfrentando um novo problema: ao executar /optas traduções do meu aplicativo, não está sendo carregado.

O que acontece é o seguinte: a menos que especificado de outra forma, os arquivos binários (arquivos MO) que contêm traduções para um aplicativo são carregados /usr/share/locale(ou no caso do Ubuntu, a partir de /usr/share/locale-langpack), mas no meu aplicativo, devido ao /optrequisito, eles são instalados em /opt/extras.ubuntu.com/qreator/locale.

Em teoria, isso é bom, pois o gettext permite especificar um local alternativo para carregar traduções, então adiciono a bindtextdomainchamada para conseguir isso:

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

Isso funciona bem até certo ponto: todas as mensagens exibidas na linha de comando aparecem traduzidas conforme o esperado. Mas isso não resolve o problema principal : carregar as traduções da UI Glade requer a especificação do domínio da tradução mais uma vez (o equivalente à gettext.textdomain('qreator')chamada acima), mas não permite especificar de onde carregar as traduções (ou seja, a Glade equivalente a bindtextdomain, que infelizmente não existe). Aqui está um extrato do código que estou 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)

Isso significa essencialmente que as traduções da interface do usuário não podem ser carregadas se o aplicativo estiver instalado /opt.

Estou praticamente preso neste momento. Alguma idéia de como fazer o Glade carregar traduções em /opt/extras.ubuntu.com/qreator/share/locale/vez de /usr/share/locale?

David Planella
fonte
Depois de falar com alguém mais entendido em Gtk.Builder, eu arquivou um bug: bugzilla.gnome.org/show_bug.cgi?id=676543
David Planella
Também fui apontado para uma solução alternativa, mas parece que não funcionou para mim - aqui está: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella
Você poderia incluir um exemplo executável mínimo completo no seu código python? Estou feliz em detalhar isso, mas não tenho certeza de quais importações estão faltando para obter um Gtk.Builder ().
Slangasek 22/05/12
n / m, aparentemente, isso é apenas 'GTK importação';)
slangasek
1
direito - Eu desisto, não parece haver nenhuma maneira sã de se gettext.bindtextdomain () para tomar posse para Glade: /
slangasek

Respostas:

10

Encontrei uma solução: use o módulo Python da localidade em vez de gettext

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

Agradecemos a Juha Sahakangas no canal # gtk + IRC por fornecer a explicação:

Nesse caso em particular, o módulo locale precisa ser usado em vez de gettext . O módulo gettext do Python é puro python; na verdade, ele não define o domínio do texto de uma maneira que a biblioteca C possa ler, mas o código do idioma sim (chamando libc). Desde que isso seja feito, o GtkBuilder já funciona da maneira que você está solicitando.

David Planella
fonte