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
?
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.