Создание апплета GNOME

Многоязычное окружение


Для "апплета на коленке" допустимо, чтобы он работал только на языке создателя. Если же есть желание показать апплет хотя бы одному другу, то резонно задуматься о работе в многоязычном окружении. Стандартный инструмент для таких вещей - GNU gettext. В Python есть его поддержка. Во время разработки программы особо ничего не меняется, лишь у каждой строки, которую нужно перевести, появляется "обертка" _().

В нашем случае, нужно переводить: всплывающие подсказки (в методе set_visual_state) и название программы, ее описание (в методе on_ppm_about). Делаем: import gettext gettext.install('proxyswitcher', unicode=True)

[...] def set_visual_state(self, state, is_on): """Set overall visual state for corresponding proxy's state""" msg_on_state = _(u"Proxy is on") msg_off_state = _(u"Proxy is off") mode = _(u"mode: %s") % state variant = (is_on and msg_on_state) or msg_off_state self.info = u"%s (%s)" % (variant, mode) self._set_image(is_on)

def on_ppm_about(self, event, data=None): """Callback for pop-up menu item 'About', show About dialog"""

pixbuf_logo = self.theme.load_icon('proxy', 80, gtk.ICON_LOOKUP_FORCE_SVG) msg_applet_name = _("Proxy switcher") msg_applet_description = _("Applet for turning proxy on/off") gnome.ui.About(msg_applet_name, __version__, __license__, msg_applet_description, [__author__,], # programming None, # documentation None, # translating pixbuf_logo, ).show()

Первым параметром в gettext.install идет название домена переводов - обычно совпадает с именем программы.

Отмечу один момент: в случае использования подстановок в строки стоит избегать конструкций _(u"some string %s with subst" % value) по той причине, что при извлечении строк для перевода, будет извлечена строка u"some string %s with subst", а во время работы программы будет искаться перевод для строки с уже подставленным значением value, поэтому лучше вынести операцию подстановки значения "за скобки", т.е. _(u"some string %s with subs") % value.


Теперь нужно извлечь строки, которые нужно перевести. И здесь есть некоторая неопределенность. В том смысле, что нет только одного способа выполнить эту операцию. Можно использовать "канонические" инструменты GNU gettext, можно использовать инструменты Python. Я приведу пример использования Python-инструментов - не только в силу специфики блога, но и по причине лучшей переносимости. Итак, делаем:

pythy@axcel:~/blog/gnome-applet/gnomeapplet_03$ pygettext -v -o po/proxyswitcher.pot proxyswitcher.py Working on proxyswitcher.py

pot-файл - это шаблон, так что копируем его в файл перевода po:

pythy@axcel:~/blog/gnome-applet/gnomeapplet_03$ cp po/proxyswitcher.pot po/ru/proxyswitcher.po

Теперь редактируем параметры перевода (в файле перевода есть "рыба") и собственно сам перевод. Далее, "компилируем" в mo-файл. В качестве "компилятора" msgfmt.py (для Debian и Ubuntu он доступен в пакете python2.4-doc):

pythy@axcel:~/blog/gnome-applet/gnomeapplet_03$ msgfmt.py -o po/ru/proxyswitcher.mo po/ru/proxyswitcher.po

"Инструментальный" этап завершен. Теперь появляется резонный вопрос: как использовать данный перевод? И здесь опять неоднозначность: Python по умолчанию ищет переводы в /usr/share/locale, однако есть возможность указать другое место, где искать переводы - передать имя каталога вторым параметром в gettext.install:

import gettext gettext.install('proxyswitcher', os.path.dirname(os.path.abspath(__file__)), unicode=True)

в данном примере переводы ищутся в той же директории, где и располагается программа. Однако стоит предостеречь о том, что в данном каталоге нужно положить файл перевода не просто так, а по соглашению <targetdir>/<lang>/LC_MESSAGES/<domain>.mo, где <targetdir> - каталог, где ищутся переводы (текущий каталог), <lang> - двухбуквенный код языка (ru), <domain> - домен перевода (proxyswitcher). И вот по вот этому соглашению, кладем файл proxyswitcher.mo в каталог ru/LC_MESSAGES/proxyswitcher.mo.Еще один момент, на который стоит обратить внимание - все строки unicode, и в gettext.install тоже указываем опцию unicode, иначе строка будет подставлена "как есть", без перекодировки (т.е. если я создавал файл перевода в коировке UTF-8, а пользователь запустит программу в KOI8-R окружении, то подставлены будут переведенные строки в UTF-8).


Содержание раздела