Как заставить 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')

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

Дэвид Планелла
источник