Как заставить Glade загружать переводы из /opt

Я создал приложение, которое я хотел бы отправить через процесс разработки приложений 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')

Это хорошо работает до определенного момента: все сообщения, которые выводятся в командной строке, затем отображаются переведенными, как и ожидалось. Но это не решает основную проблему: для загрузки переводов с поляны пользовательского интерфейса требуется еще раз указать домен перевода (эквивалент 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?

1 ответ

Решение

Я нашел решение: использовать языковой модуль 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 уже работает так, как вы просите.

Другие вопросы по тегам