## 6.27.3 プログラムやモジュールを国際化する

国際化 (I18N, I-nternationalizatio-N) とは、プログラムを複数の言語に 対応させる操作を指します。地域化 (L10N, L-ocalizatio-N) とは、すでに 国際化されているプログラムを特定地域の言語や文化的な事情に対応させる ことを指します。Python プログラムに多言語メッセージ機能を追加するには、 以下の手順を踏む必要があります:

1. プログラムやモジュールで翻訳対象とする文字列に特殊なマークを つけて準備します
2. マークづけをしたファイルに一連のツールを走らせ、生のメッセージ カタログを生成します
3. 特定の言語へのメッセージカタログの翻訳を作成します
4. メッセージ文字列を適切に変換するために `gettext` モジュールを使います

ソースコードを I18N 化する準備として、ファイル内の全ての文字列 を探す必要があります。翻訳を行う必要のある文字列はどれも `_('...')` -- すなわち関数 `_()` の呼び出しで 包むことでマーク付けしなくてはなりません。例えば以下のようにします:

    filename = 'mylog.txt'
    message = _('writing a log message')
    fp = open(filename, 'w')
    fp.write(message)
    fp.close()

この例では、文字列 `'writing a log message'` が翻訳対象候補として マーク付けされており、文字列 `'mylog.txt'` および `'w'` は されていません。

Python の配布物には、ソースコードに準備作業を行った後で メッセージカタログの生成を助ける 2 つのツールが付属します。 これらはバイナリ配布の場合には付属していたりしなかったりしますが、 ソースコード配布には入っており、Tools/i18n ディレクトリ にあります。

pygettext プログラム 6.4 は全ての Python ソースコードを走査し、予め翻訳対象としてマーク した文字列を探し出します。このツールは GNU gettext プログラムと同様ですが、Python ソースコードの機微について 熟知している反面、C 言語や C++言語のソースコードについては 全く知りません。(C 言語による拡張モジュールのように) C 言語の コードも翻訳対象にしたいのでない限り、 GNU `gettext` は必要ありません。

pygettext は、テキスト形式 Uniforum スタイルによる人間が 判読可能なメッセージカタログ .pot ファイル群を生成します。 このファイル群はソースコード中でマークされた全ての文字列と、 それに対応する翻訳文字列のためのプレースホルダを含むファイル で構成されています。 pygettext はコマンドライン形式のスクリプトで、 xgettext と同様のコマンドラインインタフェースをサポート します; 使用法についての詳細を見るには:

    pygettext.py --help

を起動してください。

これら .pot ファイルのコピーは次に、サポート対象の 各自然言語について、言語ごとのバージョンを作成する個々の人間の 翻訳者に頒布されます。翻訳者たちはプレースホルダ部分を埋めて 言語ごとのバージョンをつくり、.po ファイルとして 返します。(Tools/i18n ディレクトリ内の) msgfmt.py 6.5 プログラムを使い、翻訳者から返された .po ファイルから 機械可読な .mo バイナリカタログファイルを生成します。 .mo ファイルは、 `gettext` モジュールが実行時に 実際の翻訳処理を行うために使われます。

`gettext` モジュールをソースコード中でどのように使うかは アプリケーション全体を国際化するのか、それとも単一のモジュールを 国際化するのかによります。

... プログラム 6.4
  同様の作業を行う xpot と呼ばれるプログラムを François Pinard が書いています。このプログラムは 彼の po-utils パッケージの一部で、 http://www.iro.umontreal.ca/contrib/po-utils/HTML/ で入手できます。
...msgfmt.py 6.5
  msgfmt.py は GNU msgfmt とバイナリ互換ですが、 より単純で、Python だけを使った実装がされています。 このプログラムと pygettext.py があれば、通常 Python プログラムを国際化するために GNU gettext パッケージを インストールする必要はありません。