21.1.3.4 翻訳処理の遅延解決

コードを書く上では、ほとんどの状況で文字列はコードされた場所で 翻訳されます。しかし場合によっては、翻訳対象として文字列をマーク はするが、その後実際に翻訳が行われるように遅延させる必要が 生じます。古典的な例は以下のようなコートです:

animals = ['mollusk',
           'albatross',
	   'rat',
	   'penguin',
	   'python',
	   ]
# ...
for a in animals:
    print a

ここで、リスト animals 内の文字列は翻訳対象としてマーク はしたいが、文字列が出力されるまで実際に翻訳を行うのは避けたい とします。

こうした状況を処理する一つの方法を以下に示します:

def _(message): return message

animals = [_('mollusk'),
           _('albatross'),
	   _('rat'),
	   _('penguin'),
	   _('python'),
	   ]

del _

# ...
for a in animals:
    print _(a)

ダミーの _() 定義が単に文字列をそのまま返すように なっているので、上のコードはうまく動作します。かつ、このダミーの 定義は、組み込み名前空間に置かれた _() の定義で (del 命令を実行するまで) 一時的に上書きすることが できます。もしそれまでに _ をローカルな名前空間に 持っていたら注意してください。

二つ目の例における _() の使い方では、``a'' は文字列 リテラルではないので、pygettext プログラムが翻訳可能な 対象として識別しません。

もう一つの処理法は、以下の例のようなやり方です:

def N_(message): return message

animals = [N_('mollusk'),
           N_('albatross'),
	   N_('rat'),
	   N_('penguin'),
	   N_('python'),
	   ]

# ...
for a in animals:
    print _(a)

この例の場合では、翻訳可能な文字列を関数 N_() で マーク付けしており 21.5_() の定義とは全く衝突しません。しかしメッセージ 展開プログラムには翻訳対象の文字列が N_() でマーク されていることを教える必要が出てくるでしょう。 pygettext および xpot は両方とも、コマンドライン 上のスイッチでこの機能をサポートしています。



脚注

... マーク付けしており21.5
この N_() をどうするかは全くの自由です; MarkThisStringForTranslation() などとしてもかまいません。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。