コードを書く上では、ほとんどの状況で文字列はコードされた場所で 翻訳されます。しかし場合によっては、翻訳対象として文字列をマーク はするが、その後実際に翻訳が行われるように遅延させる必要が 生じます。古典的な例は以下のようなコートです:
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 は両方とも、コマンドライン 上のスイッチでこの機能をサポートしています。