Comment faire pour Glade charger des traductions à partir de / opt

9

J'ai créé une application que j'aimerais soumettre via le processus de développement d'applications Ubuntu . L'une des exigences du processus est que, une fois installés, tous les fichiers vont dans le /opt/extras.ubuntu.com/<appname>répertoire.

Grâce à des changements dans l'emballage et avec l'aide des autres, j'y suis parvenu, mais maintenant je suis confronté à un nouveau problème: lors de l'exécution à partir /optdes traductions de mon application ne sont pas chargées.

Ce qui se passe est le suivant: sauf indication contraire, les fichiers binaires (fichiers MO) contenant les traductions d'une application sont chargés depuis /usr/share/locale(ou dans le cas d'Ubuntu, depuis /usr/share/locale-langpack), mais dans mon application, en raison de l' /optexigence, ils sont installés dans /opt/extras.ubuntu.com/qreator/locale.

C'est très bien en théorie, car gettext permet de spécifier un autre emplacement pour charger les traductions, donc j'ajoute l' bindtextdomainappel pour y parvenir:

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

Cela fonctionne bien jusqu'à un certain point: tous les messages qui sont sortis sur la ligne de commande apparaissent alors traduits comme prévu. Mais cela ne résout pas le problème principal : pour charger les traductions à partir de l'interface utilisateur, Glade nécessite de spécifier à nouveau le domaine de traduction (l'équivalent de l' gettext.textdomain('qreator')appel ci-dessus), mais il ne permet pas de spécifier d'où charger les traductions (c'est-à-dire l'équivalent de Glade à bindtextdomain, qui n'existe malheureusement pas). Voici un extrait du code que j'utilise:

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)

Cela signifie essentiellement que les traductions de l'interface utilisateur ne peuvent pas être chargées si votre application est installée dans /opt.

Je suis à peu près coincé à ce stade. Des idées sur la façon de faire des traductions de chargement de Glade /opt/extras.ubuntu.com/qreator/share/locale/au lieu de /usr/share/locale?

David Planella
la source
Après avoir parlé à quelqu'un de plus compétent sur Gtk.Builder, j'ai déposé un bug: bugzilla.gnome.org/show_bug.cgi?id=676543
David Planella
On m'a également signalé une solution de contournement, mais cela ne semble pas fonctionner pour moi - la voici: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella
Pourriez-vous inclure un exemple exécutable minimal complet dans votre code python? Je suis heureux d'explorer cela, mais je ne suis pas sûr des importations qui me manquent pour obtenir un Gtk.Builder ().
slangasek
n / m, apparemment c'est juste 'import gtk';)
slangasek
1
à droite - j'abandonne, il ne semble pas y avoir de moyen sensé pour que gettext.bindtextdomain () prenne possession de la clairière: /
slangasek

Réponses:

10

J'ai trouvé une solution: utilisez le module Python local au lieu de gettext

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

Merci à Juha Sahakangas sur la chaîne # gtk + IRC pour avoir fourni l'explication:

Pour ce cas particulier, le module locale doit être utilisé à la place de gettext . Le module gettext de Python est pur python, il ne définit pas réellement le domaine de texte d'une manière que la bibliothèque C peut lire, mais les paramètres régionaux le font (en appelant libc). Tant que cela est fait, GtkBuilder fonctionne déjà comme vous le demandez.

David Planella
la source