Linuxでの空き地圢匏の単玔なpygtkプログラムのロヌカラむズ

すぐに2番目のバヌゞョンのpythonずgtkを予玄したす。

私はロシア語だけでなく、他の蚀語私だけでなく必芁な堎合もあるで開発しおいるプログラムのメむンフォヌムに碑文を䜜成するずいう予期せぬ欲求により、実装方法の怜玢を開始せざるを埗たせんでした。 空き地フォヌムのロヌカラむズに関する実甚的なドキュメントを簡単に芋぀けるこずができなかったため、他の人がより幞運になるように、将来この蚘事を曞くこずにしたした。

この蚘事にはないもの
-プロセスでフォヌムを翻蚳する方法。 これは芋぀かりたせんでしたが、知りたいのですが...
-プロセスで.pyコヌドのテキストを翻蚳する方法。
-もちろん、ビヌル、ブラックゞャック、その他もここにはありたせん。

翻蚳は、起動時にロケヌルたたはデフォルトのロケヌルを指定するこずにより行われたす。


最初に必芁なのは、既補の空き地フォヌムです。 なぜなら 具䜓的には簡単なテストを行っおそれを把握したしたが、フォヌムは単玔で、ラベル、ボタン、チェックボックスがありたす。

xmlフォヌムコヌド
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> <!--Generated with glade3 3.4.5 on Tue Nov 13 12:44:47 2012 --> <glade-interface> <widget class="GtkWindow" id="window1"> <child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> <widget class="GtkLabel" id="label1"> <property name="visible">True</property> <property name="label" translatable="yes">label text</property> </widget> </child> <child> <widget class="GtkButton" id="button1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="label" translatable="yes">button text</property> <property name="response_id">0</property> </widget> <packing> <property name="position">1</property> </packing> </child> <child> <widget class="GtkCheckButton" id="checkbutton1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="label" translatable="yes">checkbutton text</property> <property name="response_id">0</property> <property name="draw_indicator">True</property> </widget> <packing> <property name="position">2</property> </packing> </child> </widget> </child> </widget> </glade-interface> 


たた、このフォヌムを衚瀺するpythonプログラムも必芁になりたすこれに぀いお曞いおいるので。

 #!/usr/bin/env python # -*- coding: utf-8 -*- import pygtk, gtk, gtk.glade print "hello to me" wTree = gtk.glade.XML("localize.glade", "window1") window = wTree.get_widget("window1") window.connect("delete_event", gtk.main_quit) window.show_all() gtk.main() 

同時に、コン゜ヌルで蚀語が倉曎されおいるこずを瀺す文字列をコン゜ヌルに出力したす。

さたざたな方法でロヌカラむズできたす。 たずえば、各行/りィゞェットの凊理コヌドを自分で蚘述し、䜕らかの制埡コマンドに応じお行を曎新したす。 これには小さなプラスがありたす-すべおのアクションはプログラムのい぀でも実行できたすが、残りはマむナスです。 そしお、それはひどく芋えお動䜜したす。

問題は自然に発生したす-正方圢の車茪で車茪を再発明しないのはどうですか すべおがすでにそこにあるこずがわかったので、それを䜿甚する必芁があるだけですほずんどの堎合。

最初に、ロケヌル蚭定をナヌザヌのデフォルトにリセットする必芁がありたす通垞はLANG環境倉数で定矩されたす。 これは、マルチスレッドプログラムで起こりうる問題を取り陀くのに圹立ちたす。 このようなアクションの堎合、 ロケヌルモゞュヌルを接続する必芁がありたす。

  locale.setlocale(locale.LC_ALL, '') 

次に、 gettextモゞュヌルの機胜を䜿甚したすしたがっお、接続する必芁もありたす。 圌のドキュメントを芋るず、「バむナリ.moファむル」が必芁なこずがわかりたす。

.moファむルは、すべおの翻蚳可胜なプログラム行のリストを持぀ファむルです。

それらを取埗する方法

最初に、グレヌドフォヌムりィゞェットの碑文からすべおの行を削陀する必芁がありたすが、もちろんこれを手動で行うこずは䟡倀がありたせん。 これを行うには、intltoolコマンドのセットを䜿甚したす。

  intltool-extract --type=gettext/glade localize.glade 

必芁に応じお、远加のパラメヌタを人で芋぀けるこずができたす。 最埌の入力パラメヌタヌは、テキストをリッピングするフォヌムの空き地ファむルです。 このコマンドは、localize.glade.hファむルを䜜成したす。

  char *s = N_("label text"); char *s = N_("button text"); char *s = N_("checkbutton text"); 

ご芧のずおり、フォヌムのりィゞェットのすべおのテキスト行がリストされおいたす。

Pythonファむルには、翻蚳したい行もありたす。 ロヌカラむズする必芁はなく、ロヌカラむズチヌムが翻蚳が必芁であるこずを理解できるようにマヌクするだけです。 そのため、ドキュメントでは次のように行を蚘述するこずを掚奚しおいたす。

  print _("hello to me") 

぀たり _を取り蟌む

䞊蚘でわかるように、localize.glade.hでは、行はN_でラップされおいたす。 たた、䞀皮のマヌカヌです。

そのため、必芁なすべおのテキストにマヌクが付けられ、1぀の堎所に収集する必芁がありたす。 チヌムはこれを支揎したす

  xgettext --language=Python --keyword=_ --keyword=N_ --output=show_form.pot show_form.py localize.glade.h 

--keywordオプションは、収集時に怜玢するラベルをプログラムに瀺したす。これは、2぀の「_」ず「N_」があるためです。 --outputは出力ファむルの名前を蚭定し、ラベルを怜玢する必芁があるすべおのファむルのリストがありたすラベルは異なる可胜性があるず結論付けるこずができたすが、これは特に重芁ではないので気にしたせんでした。

結果は、次の内容のファむルです。
説明的なタむトル。
著䜜暩幎のパッケヌゞの著䜜暩者
このファむルは、PACKAGEパッケヌゞず同じラむセンスの䞋で配垃されたす。
第䞀著者<EMAIL @ ADDRESS>、幎。

、ファゞヌ
」
」
「プロゞェクトIDバヌゞョンパッケヌゞバヌゞョン\ n」
「Report-Msgid-Bugs-To\ n」
「POT-䜜成日2012-11-14 1354 + 0300 \ n」
「PO改蚂日YEAR-MO-DA HOMI + ZONE \ n」
「最埌の翻蚳者氏名<EMAIL @ ADDRESS> \ n」
「蚀語チヌムLANGUAGE <LL@li.org> \ n」
「蚀語\ n」
「MIMEバヌゞョン1.0 \ n」
「Content-Typetext / plain; 文字セット= CHARSET \ n»
「コンテンツ転送゚ンコヌド8ビット\ n」

show_form.py:14
msgstr「こんにちは」
」

localize.glade.h1
msgstr "ラベルテキスト"
」

localize.glade.h2
msgstr "ボタンテキスト"
」

localize.glade.h3
msgstr "チェックボタンのテキスト"
」

これは、将来のすべおの翻蚳ファむルのテンプレヌトです。 線集する必芁はありたせん。 今こそ蚀語を決める時です。 私は英語en_US、ロシア語ru、ドむツ語de_DEを䜿甚したした実際、ドむツ語では "Hitler Kaput"ず "Handehokh"しかわからず、それは曞かれおいたせんが、ヒヌプに眮いおください。 蚀語ごずに、テンプレヌトからロヌカラむズされたファむルを䜜成する必芁がありたす。 これはコマンドによっお行われたす

  msginit --locale=ru --input=show_form.pot msginit --locale=en_US --input=show_form.pot msginit --locale=de_DE --input=show_form.pot 

その結果、3぀のru.po、de.po、およびen_US.poファむルが衚瀺されたす。 内郚では、テンプレヌトずほが同じくらい空になっおいたすが、ヘッダヌは満たされおいたすが、垌望するデヌタではなくキヌに䜕かを指定しなかったかもしれたせん、行を他の蚀語に自然に翻蚳しおいたせん。 手で翻蚳をmsgstrフィヌルドに倉換する必芁がありたす。 たた、文字セットをutf-8に修正したした。文字サむズは16ビットおよび電子メヌルです。

結果は次のずおりです。
ru.po
パッケヌゞパッケヌゞのロシア語翻蚳。
Copyright 2012 THE PACKAGE'S COPYRIGHT HOLDER
このファむルは、PACKAGEパッケヌゞず同じラむセンスの䞋で配垃されたす。
<aaa @ bbb>、2012幎。

」
」
「プロゞェクトIDバヌゞョンパッケヌゞバヌゞョン\ n」
「Report-Msgid-Bugs-To\ n」
「POT-䜜成日2012-11-14 1354 + 0300 \ n」
「PO改蚂日2012-11-14 1358 + 0300 \ n」
「最埌の翻蚳者<aaa @ bbb> \ n」
「蚀語チヌムロシア語\ n」
「蚀語ru \ n」
「MIMEバヌゞョン1.0 \ n」
「Content-Typetext / plain; 文字セット= utf-8 \ n "
「コンテンツ転送゚ンコヌド16ビット\ n」
「耇数圢nplurals = 3; 耇数=n10 == 1 && n100= 110n10> = 2 && n "
"10 <= 4 &&n100 <10 || n100> = 2012; \ n"

show_form.py:14
msgstr「こんにちは」
「こんにちは」

localize.glade.h1
msgstr "ラベルテキスト"
msgstr "ラベル"

localize.glade.h2
msgstr "ボタンテキスト"
msgstr "ボタン"

localize.glade.h3
msgstr "チェックボタンのテキスト"
msgstrチェックマヌク

de.po
はい、ドむツ語ではありたせんが、それはたったく重芁ではありたせん
パッケヌゞパッケヌゞのドむツ語翻蚳。
Copyright 2012 THE PACKAGE'S COPYRIGHT HOLDER
このファむルは、PACKAGEパッケヌゞず同じラむセンスの䞋で配垃されたす。
<aaa @ bbb>、2012幎。

」
」
「プロゞェクトIDバヌゞョンパッケヌゞバヌゞョン\ n」
「Report-Msgid-Bugs-To\ n」
「POT-䜜成日2012-11-14 1354 + 0300 \ n」
「PO改蚂日2012-11-14 1414 + 0300 \ n」
「最埌の翻蚳者<aaa @ bbb> \ n」
「蚀語チヌムドむツ語\ n」
「蚀語de \ n」
「MIMEバヌゞョン1.0 \ n」
「Content-Typetext / plain; 文字セット= utf-8 \ n "
「コンテンツ転送゚ンコヌド16ビット\ n」
「耇数圢nplurals = 2; 耇数=n= 1; \ n "

show_form.py:14
msgstr「こんにちは」
msgstr "f"

localize.glade.h1
msgstr "ラベルテキスト"
msgstr "d"

localize.glade.h2
msgstr "ボタンテキスト"
msgstr "g"

localize.glade.h3
msgstr "チェックボタンのテキスト"
msgstr "e"

en_US.po
パッケヌゞパッケヌゞの英語翻蚳。
Copyright 2012 THE PACKAGE'S COPYRIGHT HOLDER
このファむルは、PACKAGEパッケヌゞず同じラむセンスの䞋で配垃されたす。
<aaa @ bbb>、2012幎。

」
」
「プロゞェクトIDバヌゞョンパッケヌゞバヌゞョン\ n」
「Report-Msgid-Bugs-To\ n」
「POT-䜜成日2012-11-14 1354 + 0300 \ n」
「PO改蚂日2012-11-14 1358 + 0300 \ n」
「最埌の翻蚳者<aaa @ bbb> \ n」
「蚀語チヌム英語\ n」
「蚀語en_US \ n」
「MIMEバヌゞョン1.0 \ n」
「Content-Typetext / plain; 文字セット= utf-8 \ n "
「コンテンツ転送゚ンコヌド16ビット\ n」
「耇数圢nplurals = 2; 耇数=n= 1; \ n "

show_form.py:14
msgstr「こんにちは」
msgstr「こんにちは」

localize.glade.h1
msgstr "ラベルテキスト"
msgstr "ラベルテキスト"

localize.glade.h2
msgstr "ボタンテキスト"
msgstr "ボタンテキスト"

localize.glade.h3
msgstr "チェックボタンのテキスト"
msgstr "チェックボタンのテキスト"

どうやらネむティブバヌゞョンを䜜成するようですデフォルトでen_USがありたす。 しかし、結局のずころ、他の人、たずえばde_DEを持っおいる可胜性があり、英語ぞの翻蚳を芋たいず思うでしょう。 はい。gettext開発者は䜜成するこずをお勧めしたす。

䞀郚のプログラマヌは、intltool-mergeコマンドを䜿甚しおフォヌムに倉曎を加えるこずも掚奚しおいたすが、 同時に、たったく同じフォヌムを倉曎せずに䜜成したしたが、その必芁性はわかりたせん。

したがっお、.moファむルを䜜成するためのすべおがありたす。 これはコマンドによっお行われたす

  msgfmt ru.po -o locale/ru/LC_MESSAGES/show_form.mo msgfmt en_US.po -o locale/en_US/LC_MESSAGES/show_form.mo msgfmt de.po -o locale/de/LC_MESSAGES/show_form.mo 

-oオプション非垞に明癜は、完成したファむルが配眮されるディレクトリを瀺したす。最䞊䜍ディレクトリここでは「ロケヌル」はすべおの.moファむルで同じである必芁があり、そのロケヌル名のディレクトリが移動するこずに泚意しおくださいru、de、en_US、de_DE、ru_RU-最埌の2぀には方蚀がないため、プログラムはそれらを最初の文字に枛らしたすが、フルネヌムを䜿甚できたす。 Pythonプログラムで指定されたドメむンず同じ方法で、「。mo」のみで呌び出す必芁がありたす。 たた、LC_MESSAGESは、内郚ディレクトリの名前のいく぀かの可胜なバリ゚ヌションの1぀ですたた、同じ名前を䜿甚するこずをお勧めしたす。
これに぀いおは公匏文曞が述べおいたす

...
localedir / language / LC_MESSAGES / domain.mo。蚀語はそれぞれ環境倉数LANGUAGE、LC_ALL、LC_MESSAGES、LANGで怜玢されたす。

その結果、プログラムで既に䜿甚できる改行付きのファむルが埗られたしたこのような操䜜は、Python / gladeだけでなく実行されたす。

pythonプログラムに戻りたしょう。

たず、gettextを構成したす。 ロケヌル蚭定をリセットした埌、翻蚳ファむルを取埗する堎所ずファむルを圌に䌝える必芁がありたす。 このために、2぀の倉数を導入したした。

  APP="show_form" DIR="locale" 

APPがプログラムの名前ず䞀臎するずいう事実は、ドキュメントには残っおいたせんが、任意の名前が存圚する可胜性があるず思いたす。 関連付けられおいるプログラムの名前で.moファむルを芋るず、䜕が䜕であるかを理解するのがはるかに簡単になりたす。

APPは.moファむルの名前、DIRは蚀語を含む共通ディレクトリです。 この事実gettextの説明は、次の行によっお生成されたす。

  gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) 

次に、_の圢匏の行をどうするかをPythonに説明する必芁がありたす。 これを行うには、「_」に指定されたファむルから翻蚳を取埗する機胜が割り圓おられたす。 これは2぀の方法で蚘述できたす。

  lang = gettext.translation(APP, DIR) _ = lang.gettext 

たたは

  _ = gettext.gettext 

それは、モゞュヌルコヌドを芋るず同じこずです。 したがっお、より短いレコヌドを遞択するこずは理にかなっおいたす。

これで、.pyファむル内のテキストを目的の蚀語で衚瀺できたす。 そしおgladeフォヌムをロヌカラむズするために、gtk、翻蚳の入手先、そしおどれを説明する必芁がありたす

  gtk.glade.bindtextdomain(APP, DIR) wTree = gtk.glade.XML("localize.glade", "window1", APP) 

最終コヌド

 #!/usr/bin/env python # -*- coding: utf-8 -*- import pygtk, gtk, gtk.glade import locale, gettext APP="show_form" DIR="locale" locale.setlocale(locale.LC_ALL, '') gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) _ = gettext.gettext print _("hello to me") gtk.glade.bindtextdomain(APP, DIR) wTree = gtk.glade.XML("localize.glade", "window1", APP) window = wTree.get_widget("window1") window.connect("delete_event", gtk.main_quit) window.show_all() gtk.main() 

打ち䞊げ

 LANG=en_US.utf-8 ./show_form.py 

画像

 LANG=ru_RU.utf-8 ./show_form.py 

画像

 LANG=de_DE.utf-8 ./show_form.py 

そしお、ここで゚ラヌが正盎に飛び出したす、tk。 ドむツのロケヌルは私に接続されおいたせん。 したがっお、ロケヌルを䜿甚するには、グラフィカルシェルの蚭定に远加する必芁がありたす。

それだけです

曎新 

ビルダヌに぀いお。 libgladeのフォヌムが既にある堎合は、libglade-convertを䜿甚しお倉換しようずするか゚ラヌが発生したした、ビルダヌ甚に新しいフォヌムを描画したす。

コヌドは次のようになりたす。

 #!/usr/bin/env python # -*- coding: utf-8 -*- import gtk, gtk.glade import locale, gettext APP="show_form" DIR="locale" locale.setlocale(locale.LC_ALL, '') gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) _ = gettext.gettext print _("hello to me") builder = gtk.Builder() gtk.glade.bindtextdomain(APP, DIR) builder.set_translation_domain(APP) builder.add_from_file("localize.xml") window = builder.get_object("window1") window.connect("delete_event", gtk.main_quit) window.show_all() gtk.main() 


たた、Moonriseが正しく指摘しおいるように、Content-Transfer-Encodingは8ビットに蚭定するこず぀たり、倉曎しないこずが公匏に掚奚されおいたす。

Source: https://habr.com/ru/post/J159629/


All Articles