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

9

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

Por meio de mudanças no empacotamento e com a ajuda de outras pessoas, eu consegui isso, mas agora estou enfrentando um novo problema: ao executar a partir de /opt , as traduções do meu aplicativo não estão sendo carregadas.

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

Isso é bom teoricamente, já que gettext permite especificar um local alternativo para carregar traduções, então eu adiciono o < a href="http://docs.python.org/library/gettext.html#gettext.bindtextdomain"> bindtextdomain ligue 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 que são exibidas na linha de comando aparecem traduzidas como esperado. Mas não resolve o problema principal : para carregar as traduções da interface do usuário o Glade requer a especificação do domínio de tradução mais uma vez (o equivalente à chamada gettext.textdomain('qreator') acima), mas não permite especificar onde para carregar traduções (isto é, o Glade equivalente a bindtextdomain , que infelizmente não existe). Aqui está uma extração 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 em /opt .

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

    
por David Planella 22.05.2012 / 08:05

1 resposta

10

Eu encontrei uma solução: use o módulo Python locale em vez de gettext

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

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

  

Para este caso específico, o módulo locale precisa ser usado   em vez de gettext . O módulo gettext do Python é puro python,   realmente não define o domínio de texto de uma forma que a biblioteca C pode   leia, mas locale faz (chamando libc). Enquanto isso for feito,   O GtkBuilder já funciona do jeito que você está pedindo.

    
por David Planella 23.05.2012 / 12:05