Jak zrobić Glade ładować tłumaczenia z / opt

9

Utworzyłem aplikację, którą chciałbym przesłać w procesie tworzenia aplikacji Ubuntu . Jednym z wymagań tego procesu jest to, że po zainstalowaniu wszystkie pliki trafiają do /opt/extras.ubuntu.com/<appname>katalogu.

Osiągnąłem to dzięki zmianom w opakowaniu i przy pomocy innych, ale teraz mam nowy problem: po uruchomieniu /opttłumaczenia z mojej aplikacji nie są ładowane.

To, co się dzieje, jest następujące: jeśli nie określono inaczej, pliki binarne (pliki MO) zawierające tłumaczenia aplikacji są ładowane z /usr/share/locale(lub w przypadku Ubuntu z /usr/share/locale-langpack), ale w mojej aplikacji, ze względu na /optwymaganie, są instalowane w /opt/extras.ubuntu.com/qreator/locale.

Teoretycznie jest w porządku, ponieważ gettext pozwala określić alternatywną lokalizację do ładowania tłumaczeń, więc dodaję bindtextdomainwywołanie, aby to osiągnąć:

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

Działa to dobrze do pewnego momentu: wszystkie komunikaty, które są wyświetlane w wierszu poleceń, wydają się być przetłumaczone zgodnie z oczekiwaniami. Ale to nie rozwiązuje głównego problemu : aby załadować tłumaczenia z interfejsu użytkownika, należy ponownie określić domenę tłumaczenia (odpowiednik gettext.textdomain('qreator')powyższego wywołania), ale nie pozwala określić, skąd należy ładować tłumaczenia (tj. bindtextdomain, który niestety nie istnieje). Oto fragment kodu, którego używam:

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)

Zasadniczo oznacza to, że nie można załadować tłumaczeń z interfejsu użytkownika, jeśli aplikacja jest zainstalowana /opt.

Utknąłem w tym momencie. Jakieś pomysły na to, jak zrobić Glade ładować tłumaczenia /opt/extras.ubuntu.com/qreator/share/locale/zamiast /usr/share/locale?

David Planella
źródło
Po rozmowie z kimś bardziej znającym się na Gtk.Builder, zgłosiłem błąd: bugzilla.gnome.org/show_bug.cgi?id=676543
David Planella
Zwrócono mi również uwagę na obejście, ale wydaje mi się, że nie zadziałało - oto: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella
Czy możesz podać pełny minimalny przykład do uruchomienia w kodzie Pythona? Z chęcią zagłębię się w to, ale nie jestem pewien, jakiego importu brakuje mi, aby uzyskać Gtk.Builder ().
slangasek
n / m, najwyraźniej to tylko „import gtk”;)
slangasek
1
racja - poddaję się, wydaje się, że nie ma rozsądnego sposobu na uzyskanie gettext.bindtextdomain (), aby wziąć się za polanę: /
slangasek

Odpowiedzi:

10

Znalazłem rozwiązanie: użyj lokalnego języka Python zamiast gettext

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

Dziękujemy Juha Sahakangas na kanale IRC # gtk + za wyjaśnienie:

W tym konkretnym przypadku należy użyć modułu ustawień regionalnych zamiast gettext . Moduł gettext Pythona jest czystym pythonem, tak naprawdę nie ustawia domeny tekstowej w sposób, który biblioteka C może odczytać, ale ustawienia regionalne tak (przez wywołanie libc). Dopóki tak się stanie, GtkBuilder działa już tak, jak prosisz.

David Planella
źródło