試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Pythonでgettextによるメッセージ国際化を用いる上でのgettext.install()に関する追加メモ(前半)

以前「Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(Pythonのコードについて)」で、「gettext.gettext()を用いるとngettext()を用いた箇所が日本語にならない」と書いていたが、これに関する追加メモをここで扱う。

gettext.install()について

gettext.install()

  1. 翻訳ドメイン(.moファイルのファイル名から「.mo」を除いた部分)
  2. ロケールディレクトリ(中に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()に関する追加メモ(後半)」に続く)

関連記事: