PyGtk では、Gtk.Builder も使用できます。PyGtk Gtk.Builder ドキュメントに従って:
http://developer.gnome.org/pygtk/stable/class-gtkbuilder.html#properties-gtkbuilder
インターフェイスの説明で翻訳可能としてマークされているプロパティ値を翻訳するときに使用される翻訳ドメイン。翻訳ドメインが None の場合、GtkBuilder は gettext() を使用し、それ以外の場合は dgettext() を使用します。デフォルト値: なし
つまり、Gtk.Builder は「C ライブラリ」の dgettext() を使用します。問題は、Python の gettext モジュール、関数bindtextdomain()が、何らかの理由で「C ライブラリ」を設定しないことです。オプションは、そのインターフェースも公開するlocaleモジュールを使用することです。Python ロケール モジュールのドキュメントから:
http://docs.python.org/library/locale#access-to-message-catalogs
locale モジュールは、C ライブラリの gettext インターフェイスを、このインターフェイスを提供するシステムで公開します。関数 gettext()、dgettext()、dcgettext()、textdomain()、bindtextdomain()、および bind_textdomain_codeset() で構成されます。これらは gettext モジュールの同じ関数に似ていますが、メッセージ カタログには C ライブラリのバイナリ形式を使用し、メッセージ カタログの検索には C ライブラリの検索アルゴリズムを使用します。
通常、Python アプリケーションではこれらの関数を呼び出す必要はなく、代わりに gettext を使用する必要があります。このルールの既知の例外は、gettext() または dcgettext() を内部的に呼び出す追加の C ライブラリとリンクするアプリケーションです。これらのアプリケーションでは、ライブラリがメッセージ カタログを適切に検索できるように、テキスト ドメインをバインドする必要がある場合があります。
これが現在のケースです。なんというハック :S
これで実行できます。ファイルtest.py :
from gi.repository import Gtk
from os.path import abspath, dirname, join, realpath
import gettext
import locale
APP = 'myapp'
WHERE_AM_I = abspath(dirname(realpath(__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()
私のグレードファイル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>
以下で抽出した .po に基づいてmo/LANG/LC_MESSAGES/myapp.moに moを作成することを忘れないでください:
xgettext --keyword=translatable --sort-output -o en.po test.glade
それはどのようなものか:
敬具