Как заставить 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 уже работает так, как вы просите.