Як зробити Glade завантажувати переклади з / opt


9

Я створив додаток, який я хотів би подати через процес розробника додатків Ubuntu . Однією з вимог до процесу є те, що при встановленні всі файли переходять у /opt/extras.ubuntu.com/<appname>каталог.

Через зміни в упаковці та за допомогою інших людей я цього досяг, але тепер я стикаюся з новою проблемою: коли запущені з /optперекладів мої програми не завантажуються.

Що відбувається так: якщо не вказано інше, двійкові файли (файли MO), що містять переклади для програми, завантажуються з /usr/share/locale(або у випадку Ubuntu, з /usr/share/locale-langpack), але в моєму додатку через /optвимогу вони встановлюються в /opt/extras.ubuntu.com/qreator/locale.

Це теоретично добре, оскільки gettext дозволяє вказати альтернативне місце для завантаження перекладів, тому я додаю bindtextdomainзаклик для досягнення цього:

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

Це добре працює до певного моменту: всі повідомлення, які виводяться в командному рядку, потім видаються перекладеними, як очікувалося. Але це не вирішує основну проблему : для завантаження перекладів з UI Glade потрібно ще раз вказати домен перекладу (еквівалент gettext.textdomain('qreator')виклику вище), але він не дозволяє вказувати, звідки завантажувати переклади (тобто Glade еквівалентно bindtextdomain, якого, на жаль, не існує). Ось витяг коду, який я використовую:

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)

Це по суті означає, що переклади з інтерфейсу користувача не можна завантажувати, якщо ваш додаток встановлено /opt.

Я досить застряг у цьому пункті. Будь-які ідеї, як зробити Glade завантаження перекладів /opt/extras.ubuntu.com/qreator/share/locale/замість /usr/share/locale?


Поспілкувавшись з кимось більш обізнаним у Gtk.Builder, я подав помилку: bugzilla.gnome.org/show_bug.cgi?id=676543
Девід Планелла

Мене також вказували на вирішення, але це, здається, не спрацювало для мене - ось це: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
Девід Планелла

Чи можете ви включити повний приклад мінімального запуску у свій код python? Я радий детально вивчити це, але я не впевнений, який імпорт мені не вистачає, щоб отримати Gtk.Builder ().
slangasek

н / м, мабуть, це просто 'імпорт gtk';)
slangasek

1
правильно - я здаюсь, здається, немає жодного розумного способу отримати gettext.bindtextdomain (), щоб захопити поляну: /
slangasek

Відповіді:


10

Я знайшов рішення: використовуйте локальний модуль Python замість gettext

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

Дякуємо Джуху Сахакангасу на каналі # gtk + IRC за надане пояснення:

У цьому конкретному випадку замість gettext потрібно використовувати модуль локалізації . Модуль gettext Python - це чистий python, він фактично не встановлює текстовий домен таким чином, що бібліотека C може читати, але локаль (як викликає libc). Поки це зроблено, GtkBuilder вже працює так, як ви просите.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.