さあ始めましょう
そもそも、gettextライブラリはPythonプログラムだけでなく、多くの異なる言語の翻訳にも使用されることを思い出してください。 これにより、個別の独立した翻訳ファイルを使用して翻訳できるフレーズテンプレートをプログラムで使用できます。 プログラム自体では、以前と同様に、テキストを画面、ディスク、ログ、または他の場所にすぐに表示し、翻訳された行に特別な方法でマークを付けます。 gettextライブラリを使用すると、これらの翻訳可能な文字列、翻訳ファイルのセットを取得でき、現在の言語に適した翻訳ファイルがある場合は、目的の行を置き換えることができます。
Pythonでは、Pythonにバンドルされているgettextモジュールを使用してgettextライブラリメカニズムにアクセスします。 したがって、gettextシステム自体(Pythonの外部エンティティとその操作に絶対に必要ではないエンティティ;それにもかかわらず、gettextファイルを操作するための便利なユーティリティが付属)とPythonに組み込まれたgettextモジュールを混同しません。
最初に、基本プログラムを作成し(mary.pyと呼びましょう)、異なる言語への翻訳を試みます。
#!/usr/bin/python
name = _("Mary")
animal = _("lamb")
print _("%s had a little %s") % (name, animal)
gettextモジュールを使用する場合、
_()
関数を呼び出して翻訳可能な文字列をマークするのが慣例です。 この関数はまだ定義されていません(ただし、
_ = lambda x: x
ようなものを一時的に定義することを止める人はいません)。したがって、プログラムはおそらく起動することさえできません...
おそらく、プログラムのすべての翻訳可能な行を指定することを覚えておく必要がある関連付けを持つ新しいテキストファイルを作成することになるとお考えでしょうか。 私たちの場合、そのような行は3行だけですが、深刻なプログラムではもっと多くの行が存在する可能性があります...
翻訳テンプレート:.pot
...あなたはほとんど推測しました。 ファイルを作成します。 ただし、同時にgettextシステムの優れた機能(翻訳可能な文字列のソースファイルを含むファイルの分析)を利用します。 この呼び出しがgettextを真剣に使用する前に_()関数の呼び出しで慎重にマークしたため、パーサーはすぐにそれらを収集できます。
gettextシステムはあらゆるプログラミング言語での使用を指向しているため、xgettextプログラムが含まれています。このプログラムは、C、C ++、ObjectiveC、C#、Java、Perl、Python、PHP、Lispなどのかなり多数の言語のソースから翻訳用のテンプレートファイルを生成できます...しかし、これは、gettextプログラムパッケージ自体をインストールするのが面倒ではなかった場合(「aptitude install gettext」、またはディストリビューションにあるもの)です。 しかし、私たちはプログラムを翻訳するのに十分なPythonプログラムを書いています。 したがって、Pythonに含まれているpygettext.pyスクリプト(またはUnixではpygettext)を使用します。
pygettext:
pygettext mary.py
起動し
pygettext mary.py
プログラムと同じディレクトリに、次を含むmessages.potファイルが表示されました。
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2009-10-28 01:12+MSK\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
#: mary.py:6
msgid "Mary"
msgstr ""
#: mary.py:7
msgid "lamb"
msgstr ""
#: mary.py:10
msgid "%s had a little %s"
msgstr ""
これは何ですか これは、プログラム全体を翻訳するためのテンプレートです。 翻訳者の大規模なチームがある場合は、このテンプレートを各ターゲット言語の各翻訳者に渡すことができます。翻訳者は自分の言語の完成したテンプレートを返送する必要があります。 通常、テンプレートには.pot拡張子があり、完成したファイルには.po拡張子があります。
ファイルの構文は非常に透過的です。 コメント、翻訳の著作権表示、元の行と翻訳のペア。 「Content-Type:」の行と翻訳に必要な行を除き、ファイルから余分なものをすべて削除し、エンコードUTF-8を示し、翻訳を記述します。
翻訳ファイル:.po
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
msgid "Mary"
msgstr ""
msgid "lamb"
msgstr ""
msgid "%s had a little %s"
msgstr " %s %s"
私たちの場合、ファイルは非常に小さくシンプルです。 より複雑な場合は、 Poeditのような.poファイルの専用エディター、または「すべての専用エディター」 Emacsを使用する方が便利です。
コンパイル済み翻訳ファイル:.mo
そこで、プログラムの行を翻訳しました。 ところで、無駄に。 gettextは、完成した完成した文章を翻訳することだけを目的としており、その中の個々の単語と文章テンプレートを翻訳することは危険です...(たとえば、gettextはケースと性別をまったくサポートせず、どういうわけか単数形と複数形の区別のみをサポートします;メアリー「ターニャ」または「ライト」は、元の名前を使用するたびにケースを検討する必要があります。)まあ、大丈夫-私たちの場合、これは重要ではありません。 現在、別のタスクがあります。使用する翻訳ファイルを準備することです。
パフォーマンス上の理由(翻訳されたテキストが多いプログラム)のためにソーステキストファイルを使用するのは不便であるため、gettextシステムは特別な形式でコンパイルされたファイルを使用します。 コンパイルには、gettextパッケージのmsgfmtツールまたはPythonパッケージのmsgfmt.pyツールを使用できます(debianライクな配布では、python2.5-examplesパッケージの一部です)。 2番目のものを使用します。
msgfmt.py mary.po
はい、mary.moファイルを参照してください。 mary.poとは異なり、これは明らかに手動での編集を目的としたものではありません。
ディレクトリ構造とプログラムの起動
サービスディレクトリにインストールするプログラムを準備した場合、この階層(Debian linuxの場合)のようなものを作成します:システムディレクトリ/ usr / share /ロケール、その中の異なる言語のサブディレクトリ-ru、enなど。 それらの中-LC_MESSAGESディレクトリの下、そして既に-mary.moのようなファイル(他のプログラムと交差しないように最もユニークな名前を持つ)。 しかし、トレーニングの場合、ディレクトリにロケールサブディレクトリを作成し、その中にru / LC_MESSAGESサブディレクトリを作成し、最後のサブディレクトリにmary.moを配置します。
最後に、プログラムにgettextサポートを追加します。
#!/usr/bin/python
import gettext
gettext.install('mary', './locale', unicode=True)
name = _("Mary")
animal = _("lamb")
print _("%s had a little %s") % (name, animal)
何が変わった? gettextモジュールをインポートしました(これは明らかです)。 また、プログラムのグローバルスペースに_()関数をインストールしました。これは、。/ localeサブディレクトリ(2番目の引数)の行を変換し、現在のロケール(同じruサブディレクトリ)のディレクトリを見つけ、そのLC_MESSAGESサブディレクトリでunicodeを検索します(3番目の引数)maryプログラムの翻訳用のmary.moファイル(最初の引数)。
「インストール済み」という言葉の意味は何ですか? そして、このアクションの後、プログラムの他のモジュールをインポートでき、その中の_()関数が既に定義されているという事実。
プログラムを開始します...
1:/tmp/mary> ./mary.py
うん。 そのようなもの。
ボーナス
Google翻訳によると、日本語の.poファイルは次のようになります。
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
msgid "Mary"
msgstr "メアリー"
msgid "lamb"
msgstr "子羊"
msgid "%s had a little %s"
msgstr "%sの%sいた"
そして、(ロシア語に加えて)日本語の通常のサポートのために、コードの最後の行を
print (_("%s had a little %s") % (name, animal)).encode('UTF-8')
チェックイン作業:
1:/tmp/mary> LANG=ja_JP.UTF-8 ./mary.py
メアリーの子羊いた