Ответ 1
В PyGtk вы также можете использовать Gtk.Builder. В соответствии с документацией PyGtk Gtk.Builder:
http://developer.gnome.org/pygtk/stable/class-gtkbuilder.html#properties-gtkbuilder
Область перевода, используемая при переводе значений свойств, которые имеют помечены как переводимые в описаниях интерфейсов. Если домен перевода - None, GtkBuilder использует gettext(), иначе dgettext(). Значение по умолчанию: None
То есть, Gtk.Builder использует dgettext() из библиотеки "C". Проблема в том, что Python gettext module, функция bindtextdomain(), по какой-то неизвестной мне причине, не устанавливает "библиотеку C". Опция заключается в использовании модуля locale, который также предоставляет этот интерфейс. Из документации модуля языка Python:
http://docs.python.org/library/locale#access-to-message-catalogs
Модуль locale предоставляет интерфейс gettext C библиотеки для систем которые обеспечивают этот интерфейс. Он состоит из функций gettext(), dgettext(), dcgettext(), textdomain(), bindtextdomain() и bind_textdomain_codeset(). Они аналогичны тем же функциям в модуль gettext, но использовать бинарный формат библиотеки C для сообщения каталоги и алгоритмы поиска библиотек C-библиотек для определения местоположения сообщения каталоги.
Приложениям Python обычно не требуется ссылаться на эти функций, и вместо этого следует использовать gettext. Известное исключение из этого правило - это приложения, которые связывают с дополнительными библиотеками C, которые внутренне вызывать gettext() или dcgettext(). Для этих приложений это может потребоваться для привязки текстового домена, так что библиотеки могут правильно найти каталоги сообщений.
Какой, это текущий случай. Какой взлом: S
Это сделает это, файл test.py:
from gi.repository import Gtk
from os.path import abspath, dirname, join
import gettext
import locale
APP = 'myapp'
WHERE_AM_I = abspath(dirname(__file__))
LOCALE_DIR = join(WHERE_AM_I, 'mo')
locale.setlocale(locale.LC_ALL, '')
locale.bindtextdomain(APP, LOCALE_DIR)
gettext.bindtextdomain(APP, LOCALE_DIR)
gettext.textdomain(APP)
_ = gettext.gettext
print('Using locale directory: {}'.format(LOCALE_DIR))
class MyApp(object):
def __init__(self):
# Build GUI
self.builder = Gtk.Builder()
self.glade_file = join(WHERE_AM_I, 'test.glade')
self.builder.set_translation_domain(APP)
self.builder.add_from_file(self.glade_file)
print(_('File'))
print(_('Edit'))
print(_('Find'))
print(_('View'))
print(_('Document'))
# Get objects
go = self.builder.get_object
self.window = go('window')
# Connect signals
self.builder.connect_signals(self)
# Everything is ready
self.window.show()
def main_quit(self, widget):
Gtk.main_quit()
if __name__ == '__main__':
gui = MyApp()
Gtk.main()
Файл My Glade test.glade:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="window_position">center-always</property>
<property name="default_width">400</property>
<signal name="destroy" handler="main_quit" swapped="no"/>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">File</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Edit</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Find</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">View</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Document</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
Не забудьте создать mo в mo/LANG/LC_MESSAGES/myapp.mo на основе .po, извлеченного с помощью
xgettext --keyword=translatable --sort-output -o en.po test.glade
Как выглядит:
С уважением