web-dev-qa-db-ja.com

Gladeが/ optから翻訳をロードする方法

buntuアプリ開発者プロセス を通じて送信したいアプリケーションを作成しました。プロセスの要件の1つは、インストール時に、すべてのファイルが_/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')
_

これは、ある時点まではうまく機能します。コマンドラインに出力されるすべてのメッセージは、期待どおりに翻訳されたように見えます。しかし、それは主な問題を解決しません:UI Gladeから翻訳をロードするには、翻訳ドメインをもう一度指定する必要があります(gettext.textdomain('qreator')上記の呼び出し)、ただし、翻訳の読み込み元を指定することはできません(つまり、残念ながら存在しないbindtextdomainに相当するGlade)。私が使用しているコードの抜粋は次のとおりです。

_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_にインストールされている場合、UIからの翻訳をロードできないことを意味します。

私はこの時点でほとんど立ち往生しています。 Gladeが_/opt/extras.ubuntu.com/qreator/share/locale/_ではなく_/usr/share/locale_から翻訳をロードする方法に関するアイデアはありますか?

9
David Planella

私は解決策を見つけました:localePythonモジュールの代わりにを使用してくださいgettext

import locale
from locale import gettext as _
locale.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
locale.textdomain('qreator')

説明を提供してくれた#gtk + IRCチャネルのJuha Sahakangasに感謝します。

この特定のケースでは、 gettext の代わりに locale モジュールを使用する必要があります。 Pythonのgettextモジュールは純粋なpythonで、実際にはCライブラリが読み取れるようにテキストドメインを設定しませんが、localeは(libcを呼び出すことにより)行います。それが行われている限り、GtkBuilderは既にあなたが求めている方法で動作しています。

10
David Planella