For Development HEAD DRAFTSearch (procedure/syntax/module):

12.70 text.gettext - 地域化メッセージ

Module: text.gettext

このモジュールは地域化メッセージを扱うユーティリティを提供します。 API は GNU の gettext と互換性があり、メッセージは *.po および *.mo ファイルから読み込まれます。それゆえ、GNU の gettext toolchain をつかって地域化メッセージを準備することができます。しかし、このコードは Alex Shinn によってスクラッチから書き起こされたものであり、GNU の gettext ライブラリには依存していません。

この実装は GNU の gettext API を以下のように拡張したものです。

  • 複数のメッセージファイルから、カスケードされた方法で読み込むことができます。 これにより、アプリケーションはメッセージファイルの部分を共有できます。
  • 複数のロケール/ドメインを同時に扱えます。

SRFI-29 (srfi.29 - 地域化参照) はこれとは別のメッセージの地域化 機構を提供しています。ポータブルなプログラムでは、SRFI-29 の方がよいこと もありますが、一般には、Gauche スクリプトでは、text.gettext の 方を推奨します。それは、既存のメッセージファイルとの互換性と柔軟性の ためです。

gettext-互換の API

Function: textdomain domain-name :optional locale dirs cdir cached? lookup-cached?

{text.gettext} アプリケーション用に、デフォルトのドメインとそのほかのパラメータを 設定します。この設定は、以降の gettext の呼出しに影響を与えます。

domain は文字列または文字列のリストで、ドメイン(.mo あるいは .po ファイル名)を C の gettext と同じように指定します。 #fdomain-name として渡すと、デフォルトのドメインアクセサ 手続きが得られます。また、複数のドメインを domain-nameにあたえる ことができます。

(textdomain '("myapp" "gimp"))  ; search 1st myapp, then gimp
(gettext "/File/Close")         ; "Close" from gimp unless overridden

locale は文字列または文字列のリストで、標準的なUnixのフォーマット LANG[_REGION][.ENCODING] です。フォールバックを指定するロケール のリストを渡すこともできます。

(textdomain "myapp" '("ru" "uk"))  ; search 1st Russian then Ukranian,
(gettext "Hello, World!")          ; which are somewhat similar

dirs は実際のメッセージカタログを含む LOCALE/CDIR/ ディレクトリのサーチパスです。これは常にシステムのデフォルト(たとえば、 "/usr/share/locale")に追加されます。そして、コロンで区切られた GETTEXT_PATH 環境変数を継承します。

cdir はカテゴリーディレクトリで、既定値を LC_CATEGORY 環境変数または、適当なシステム既定値(たとえば LC_MESSAGES)に 設定します。一般にはこれを指定する必要はありません。

cached? は個別のメッセージをキャッシュするかを意味し、デフォルトは #t です。

lookup-cached? は、これらのパラメータで生成されるディスパッチをキャッシュするかどうか を意味し、デフォルトは #t です。

textdomain はこれらのパラメータを内部の make-gettext に 渡し、その結果を、gettext で使われるグローバルなディスパッチに 束縛します。これらのクロージャを複数の別々のドメインやロケールを一度に 扱うのに便利なように、手で構築することができます。(これらは サーバ環境で便利です。) 後述の make-gettext を参照してください。

textdomain はそのドメインの情報をもつ アクセサ手続きを 返します。詳細については、後述の make-gettext を参照してください。

Function: gettext msg-id

{text.gettext} msg-id の翻訳されたメッセージを返します。もし、翻訳された メッセージがなければ、msg-id それ自身を返します。

Function: ngettext msg-id :optional msg-id2 num

{text.gettext} gettextと似ていますが、複数形を処理するのに使うことが できます。単数形のメッセージを msg-id へ、複数形のメッセージを msg-id2 に渡します。num 引数は、複数形を決定 するのに使われます。もし、メッセージカタログが見つからなければ、 num が 1 のときは、msg-id が返り、そうでなければ、 msg-id2 が返ります。

Function: bindtextdomain domain dirs

{text.gettext} ドメイン domain のサーチパスを dirs に設定します。 単一のディレクトリ名であったり、ディレクトリのリストであったりします。

Function: dgettext domain msg-id
Function: dcgettext domain msg-id locale

{text.gettext} domain 中の msg-id の翻訳されたメッセージを返します。 dcgettextlocale も引数としてとります。

低水準の柔軟な API

以下の手続きはより柔軟性のあるインタフェースで、この上で、gettext-互換の API が書かれています。

Function: make-gettext :optional domain locale dirs gettext-cached? lookup-cached?

{text.gettext} アクセサ手続き を生成して返します。返された手続きは、 地域化されたメッセージを検索するメソッドをカプセル化しています。

引数の意味は上述の textdomain と同じです。 実際は、textdomainmake-gettext を呼び、その後、 それは、結果をこのグローバルパラメータに束縛します。make-gettext を直接呼んで、自分自身で、アクセサ手続きを管理することもできます。

(define my-gettext (make-gettext "myapp"))
(define _ (my-gettext 'getter))
(_ "Hello, World!")


For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT