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

#### Footnotes

... マーク付けしており 43
  この `N_()` をどうするかは全くの自由です; `MarkThisStringForTranslation()` などとしてもかまいません。