So laden Sie Glade-Übersetzungen von / opt

9

Ich habe eine Anwendung erstellt, die ich über den Ubuntu-App-Entwicklerprozess einreichen möchte . Eine der Anforderungen für den Prozess ist, dass bei der Installation alle Dateien in das /opt/extras.ubuntu.com/<appname>Verzeichnis verschoben werden.

Durch Änderungen in der Verpackung und mit Hilfe anderer habe ich das erreicht, aber jetzt stehe ich vor einem neuen Problem: Beim Ausführen werden /optdie Übersetzungen aus meiner App nicht geladen.

Folgendes passiert: Sofern nicht anders angegeben, werden die Binärdateien (MO-Dateien), die Übersetzungen für eine Anwendung enthalten, von /usr/share/locale(oder im Fall von Ubuntu von /usr/share/locale-langpack) geladen , aber in meiner App werden sie aufgrund der /optAnforderungen in installiert /opt/extras.ubuntu.com/qreator/locale.

Das ist theoretisch in Ordnung, da gettext die Angabe eines alternativen Speicherorts zum Laden von Übersetzungen ermöglicht. Deshalb füge ich den bindtextdomainAufruf hinzu, um dies zu erreichen:

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

Das funktioniert bis zu einem gewissen Punkt: Alle Nachrichten, die in der Befehlszeile ausgegeben werden, werden dann wie erwartet übersetzt. Aber es ist nicht das Hauptproblem lösen : die Übersetzungen aus dem UI Glade laden erfordert , sobald die Übersetzung Domain Angabe mehr (das entspricht den gettext.textdomain('qreator')Aufruf oben), aber es funktioniert nicht zulassen , wo die Angabe laden Übersetzungen aus (dh der Glade entspricht bindtextdomain, was leider nicht existiert). Hier ist ein Auszug des Codes, den ich verwende:

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)

Dies bedeutet im Wesentlichen, dass Übersetzungen von der Benutzeroberfläche nicht geladen werden können, wenn Ihre App installiert ist /opt.

Ich stecke an diesem Punkt ziemlich fest. Irgendwelche Ideen, wie man Glade-Übersetzungen /opt/extras.ubuntu.com/qreator/share/locale/anstelle von erstellt /usr/share/locale?

David Planella
quelle
Nachdem ich mit jemandem gesprochen habe, der mehr über Gtk.Builder weiß, habe ich einen Fehler gemeldet
David Planella
Ich wurde auch auf eine Problemumgehung hingewiesen, aber es schien für mich nicht zu funktionieren - hier ist es: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella
Könnten Sie Ihrem Python-Code ein vollständig minimal ausführbares Beispiel hinzufügen? Ich gehe gerne näher darauf ein, bin mir aber nicht sicher, welche Importe mir fehlen, um einen Gtk.Builder () zu erhalten.
Slangasek
n / m, anscheinend ist das nur 'import gtk';)
slangasek
1
richtig - ich gebe auf, es scheint keinen vernünftigen Weg zu geben, gettext.bindtextdomain () dazu zu bringen, sich für die Lichtung zu entscheiden: /
slangasek

Antworten:

10

Ich habe eine Lösung gefunden: Verwenden Sie das Gebietsschema Python-Modul anstelle von gettext

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

Vielen Dank an Juha Sahakangas vom # gtk + IRC-Kanal für die Erklärung:

In diesem speziellen Fall muss das Gebietsschemamodul anstelle von gettext verwendet werden . Das gettext- Modul von Python ist reines Python. Es legt die Textdomäne nicht so fest, dass die C-Bibliothek sie lesen kann, sondern das Gebietsschema (durch Aufrufen von libc). Solange dies erledigt ist, funktioniert GtkBuilder bereits so, wie Sie es verlangen.

David Planella
quelle