web-dev-qa-db-fra.com

Comment faire pour que Glade charge les traductions depuis / opt

J'ai créé une application que je souhaiterais soumettre par l'intermédiaire du processus de développement d'applications Ubunt . L'une des conditions requises pour le processus est que, une fois installés, tous les fichiers sont placés dans le répertoire /opt/extras.ubuntu.com/<appname>.

Grâce à des modifications apportées à l'emballage et avec l'aide d'autres personnes, j'ai atteint cet objectif, mais je suis maintenant confronté à un nouveau problème: lorsque je lance /opt, les 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'exigence /opt, ils sont installés dans /opt/extras.ubuntu.com/qreator/locale.

En théorie, c’est bien, car gettext permet de spécifier un autre emplacement pour charger les traductions, aussi j’ajoute l’appel bindtextdomain 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 point: tous les messages qui sont affichés sur la ligne de commande apparaissent alors traduits comme prévu. Mais cela ne résout pas le problème principal : charger les traductions depuis l'interface utilisateur nécessite de spécifier à nouveau le domaine de traduction (l'équivalent de l'appel gettext.textdomain('qreator') ci-dessus ), mais ne permet pas de spécifier où charger les traductions (c'est-à-dire l'équivalent de Glade équivalent à 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 bloqué à ce stade. Des idées sur la façon de faire des traductions de chargement Glade à partir de /opt/extras.ubuntu.com/qreator/share/locale/ au lieu de /usr/share/locale?

9
David Planella

J'ai trouvé une solution: utilisez le module locale Python 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 du canal # gtk + IRC pour l'explication fournie:

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

10
David Planella