Pythonでgettextによるメッセージ国際化を用いる上でのgettext.install()に関する追加メモ(前半)
以前「Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(Pythonのコードについて)」で、「gettext.gettext()を用いるとngettext()を用いた箇所が日本語にならない」と書いていたが、これに関する追加メモをここで扱う。
gettext.install()について
gettext.install()は
- 翻訳ドメイン(.moファイルのファイル名から「.mo」を除いた部分)
- ロケールディレクトリ(中にLC_MESSAGESディレクトリを含むロケール名ディレクトリ群を含んだディレクトリ・/usr/share/locale/など)
を引数に指定することでそのロケールディレクトリ内の翻訳ドメインに合った.moファイルから英語メッセージに合った各自然言語のテキストを_()関数で取得できる状態にする。
この関数を用いる場合はgettext.bindtextdomain()やgettext.textdomain()は必要ない。
組み込み名前空間への_()やngettext()の組み込み
「_()関数で取得できる状態にする」というのがgettext.install()の特徴で、gettext.gettext()を「gettext.gettext()」のようにモジュール名付きの表記で呼び出したり「from gettext import gettext as _」のimport文を実行したりすることなく、「.」を含まない表記(組み込み名前空間・現在の名前空間)の「_()」で記述できるようになる。
これは標準ではgettext.gettext()に相当する_()にのみ適用されるが、gettext.install()の引数namesのシーケンス型(タプルやリスト)に文字列「ngettext」を含めるようにすると、単語の単数形/複数形を処理できるngettext()についても「.」を含まない表記(組み込み名前空間)の「ngettext()」で記述できるようになる。
正しい呼び出し方
「ngettext()を用いた箇所が日本語にならない」と書いていたのは
- gettext.install()のnames引数を付けていない
- 「gettext.ngettext()」として呼び出していた
の2つが原因で
- gettext.install()のnames引数に文字列「ngettext」を含める
- ngettext()は(組み込み名前空間の)「ngettext()」として呼び出す
とすることで、正しく日本語などのメッセージに置き換わるようになった。
(「Pythonでgettextによるメッセージ国際化を用いる上でのgettext.install()に関する追加メモ(後半)」に続く)
関連記事: