23

ではgettext、デフォルトのシステム全体のロケール ディレクトリを使用するか、 を使用して自分で指定することができますbindtextdomain。これは、コンパイルされた .mo 変換ファイルがシステムのデフォルトの場所にない場合に、ソースからプログラムを直接実行する場合に便利です。

Python では、次のようにします。

import gettext
from gettext import gettext as _
gettext.bindtextdomain('nautilus-image-manipulator', '/path/to/mo/folder')
gettext.textdomain('nautilus-image-manipulator')

where/path/to/mo/folderにはおなじみのfr/LC_MESSAGES/nautilus-image-manipulator.mo構造が含まれています。次のように呼び出します。

print _("Delete this profile")

ローカルの .mo ファイルから適切に翻訳された文字列を返します。どうもありがとうございました。

GTK+2/ gtk.glade.bindtextdomainpygtk には がありましたが、GTK+3/PyGObject に相当するものはないかと考えています。

具体的な例を挙げると、Nautilus Image Manipulator の UIが Glade ファイルから作成される方法は次のとおりです。

from gi.repository import Gtk
builder = Gtk.Builder()
builder.set_translation_domain('nautilus-image-manipulator')
builder.add_from_file(ui_filename)
return builder

Glade ファイルから構築されていない (コードから設定された) UI の部分は適切に翻訳されて表示されますが、Glade ファイルの文字列は英語で表示されます。

builder.bind_text_domain('nautilus-image-manipulator', '/path/to/mo/folder')への呼び出しの前に、ある種への呼び出しが欠落しているように思えbuilder.set_translation_domainます...これを実行する方法はありますか?

4

3 に答える 3

15

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

それはどのようなものか:

ここに画像の説明を入力

敬具

于 2012-05-10T19:17:18.117 に答える