### 6.27.2.2 `GNUTranslations` クラス

`gettext` モジュールでは `NullTranslations` から 導出されたもう一つのクラス: `GNUTranslations` を提供しています。 このクラスはビッグエンディアン、およびリトルエンディアン両方の バイナリ形式の GNU gettext .mo ファイル を読み出せるように `_parse()` を上書きしています。 また、このクラスはメッセージ id とメッセージ文字列の両方を Unicode に型強制します。

このクラスではまた、翻訳カタログ以外に、オプションのメタデータ を読み込んで解釈します。GNU gettext では、空の文字列に 対する変換先としてメタデータを取り込むことが慣習になっています。 このメタデータは RFC 822 形式の `key: value` のペアに なっており、 `Project-Id-Version` キーを含んでいなければ なりません。キー `Content-Type` があった場合、 `charset` の特性値 (property) は ``保護された'' `_charset` インスタンス 変数を初期化するために用いられます。値がない場合には、デフォルトと して `None` が使われます。 エンコードに用いられる文字セットが指定されている場合、カタログから 読み出された全てのメッセージ id とメッセージ文字列は、指定された エンコードを用いて Unicode に変換されます。`ugettext()` は常に Unicode を返し、`gettext()` はエンコードされた 8 ビット文字列を返します。どちらのメソッドにおける引数 id の 場合も、Unicode 文字列か US-ASCII 文字のみを含む 8 ビット文字列 だけが受理可能です。国際化されたPython プログラムでは、メソッドの Unicode 版 (すなわち `ugettext()` や `ungettext()`) の利用が推奨されています。

key/value ペアの集合全体は辞書型データ中に配置され、``保護された'' `_info` インスタンス変数に設定されます。

.mo ファイルのマジックナンバーが不正な場合、あるいは その他の問題がファイルの読み出し中に発生した場合、 `GNUTranslations` クラスのインスタンス化で `IOError` が送出されることがあります。

以下のメソッドは基底クラスの実装からオーバライドされています:

`gettext`( | message)

  カタログから message id を検索して、対応するメッセージ文字列を、 カタログの文字セットが既知のエンコードの場合、エンコードされた 8 ビット 文字列として返します。message id に対するエントリがカタログに 存在せず、フォールバックが設定されている場合、フォールバック 検索はオブジェクトの `gettext()` メソッドに転送されます。 そうでない場合、message id 自体が返されます。

`ugettext`( | message)

  カタログから message id を検索して、対応するメッセージ文字列を、 Unicode でエンコードして返します。message id に対するエントリが カタログに存在せず、フォールバックが設定されている場合、フォールバック 検索はオブジェクトの `ugettext()` メソッドに転送されます。 そうでない場合、message id 自体が返されます。

`ngettext`( | singular, plural, n)

  メッセージ id に対する複数形を検索します。カタログに対する検索では singular がメッセージ id として用いられ、 n には どの複数形を用いるかを指定します。返されるメッセージ文字列は 8 ビットの文字列で、カタログの文字セットが既知の場合にはその 文字列セットでエンコードされています。

  メッセージ id がカタログ中に見つからず、フォールバックオブジェクト が指定されている場合、メッセージ検索要求はフォールバックオブジェクトの `ngettext()` メソッドに転送されます。そうでない場合、 n が 1 ならば singular が返され、それ以外に対しては plural が返されます。

  バージョン2.3 以降で新規追加された 仕様です。

`ungettext`( | singular, plural, n)

  メッセージ id に対する複数形を検索します。カタログに対する検索では singular がメッセージ id として用いられ、 n には どの複数形を用いるかを指定します。返されるメッセージ文字列は Unicode 文字列です。

  メッセージ id がカタログ中に見つからず、フォールバックオブジェクト が指定されている場合、メッセージ検索要求はフォールバックオブジェクトの `ungettext()` メソッドに転送されます。そうでない場合、 n が 1 ならば singular が返され、それ以外に対しては plural が返されます。

  以下に例を示します。:

      n = len(os.listdir('.'))
      cat = GNUTranslations(somefile)
      message = cat.ungettext(
          'There is %(num)d file in this directory',
          'There are %(num)d files in this directory',
          n) % {'n': n}

  バージョン2.3 以降で新規追加された 仕様です。