コードを書く上では、ほとんどの状況で文字列はコードされた場所で 翻訳されます。しかし場合によっては、翻訳対象として文字列をマーク はするが、その後実際に翻訳が行われるように遅延させる必要が 生じます。古典的な例は以下のようなコートです:
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_() で マーク付けしており 6.6 、_() の定義とは全く衝突しません。しかしメッセージ 展開プログラムには翻訳対象の文字列が N_() でマーク されていることを教える必要が出てくるでしょう。 pygettext および xpot は両方とも、コマンドライン 上のスイッチでこの機能をサポートしています。