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

11.9 srfi.29 - 地域化

Module: srfi.29

このモジュールは SRFI-29 で定義されたメッセージの地域化機構を実装したものです。

実際には、このモジュールは2つのサブモジュール、srfi.29.bundle および srfi.29.format で構成されています。srfi.29モジュールは このふたつのモジュールをextendしています。このようにしているのは、 SRFI-29 での format 手続きの定義が Gauche ネイティヴの(すなわち Common Lisp の) format とでは ~@* 指令の扱い において互換性がないからです。

そんなわけで、SRFI-29 の format を含む srfi.29.format と それ以外(「バンドル」API)を含む srfi.29.bundle に分離しました。 プログラムを SRFI-29 と完全に互換性のあるものにしたければ、srfi.29 モジュールを使って下さい。こうすると Gauche ネイティヴの format が上書きされます。SRFI-29 の「バンドル」API を使いたいだけで、 Gauche の format をそのままにしておきたいなら、srfi.29.bundle を使って下さい。

地域化機能は text.gettext モジュールによっても提供され (see text.gettext - 地域化メッセージ)、Gauche でメッセージの地域化をするのなら text.gettext を使うのが好ましい方法です。srfi.29 モジュールは 主として SRFI-29 の機能を使っているコードをポーティングするためにあります。

バンドル指定子

バンドル指定子はシンボルを要素とする任意のリストです。しかし 典型的には以下のようなフォームになります。

(package language country details ...)

ここで、package はソフトウェアパッケージを指定し、 language および country は言語と国コードを指定、そして、 details はエンコーディングのようなそのほかの情報を指定します。

デフォルトのバンドル指定子の値は以下のようなパラメータで取得可能です。

Parameter: current-language
Parameter: current-country
Parameter: current-locale-details

[SRFI-29]{srfi.29} current-language および current-country パラメータは ISO 639-1 の言語コードと ISO 3166-1 の国コードをそれぞれシンボルで 保持しています。current-locale-details はエンコーディングのような 補助的な地域情報のリストを保持しています。

これらのパラメータは、環境変数 LANGlang_country.encoding フォーマットの形式で設定されていれば、初期化されます。たとえば、 LANGja_JP.eucJP に設定されていれば、それらの パラメータはそれぞれ jajp(eucjp) に設定されます。 LANGC であるかあるいは定義されていなければ、 デフォルト値は、それぞれ enus() です。

バンドル準備

Function: declare-bundle! bundle-specifier association-list

[SRFI-29]{srfi.29} テンプレートキー(シンボル)と特定ロケールのメッセージ(文字列)の連想リストを bundle-specifier をキーとして、バンドルデータベースに入れます。

Gauche は現在のところメモリ上のバンドルデータベースのみサポートしています。 つまり、地域化されてメッセージを探しあてるには、そのアプリケーション内で declare-bundle! を呼ぶ必要があるということです。

Function: save-bundle! bundle-specifier
Function: load-bundle! bundle-specifier

[SRFI-29]{srfi.29} Gauche は今のところ永続バンドルデータベースをサポートしていないので、 これらの手続きはなにもせず #f を返します (これはいまのところ srfi-29 の振舞いと適合しています)。

地域化されたメッセージの検索

Function: localized-template package-name message-template-name

[SRFI-29]{srfi.29} 地域化されたメッセージを検索します。当該メッセージは package-name パッケージの中で、message-template-name シンボルと関連つけられています。

拡張された format 手続き

Function: format format-string args

[SRFI-29]{srfi.29} SRFI-29 は SRFI-28 の format 手続きの仕様(これは ~a~s~% および ~~ 指令をサポートしている)を 引数再配置をサポートするために拡張しています。

~N@* 指令は N-番目のオプション引数から値を引き出す次の 指令の契機となります。参照された値が消費されることはありません。また、 参照された値がその後につづく指令の処理に影響を与えることはありません。

SRFI-28 の仕様は Gauche ネイティヴの format (see 出力) と 互換性がありますが、この SRFI-29 の拡張には互換性がありません。 具体的には、Gauche ネイティヴの format~N@* 指定は 引数ポインタを N-番目のオプション引数を指すように変更します。 それゆえ、そのあとに続くすべての引数に影響をあたえます。

この非互換性があるために、この関数は、分離したモジュール srfi.29.format で定義されています。srfi.29.bundlesrfi.29.format を拡張する srfi.29 を使うと、format 手続きは SRFI-29 の format でそのモジュール内で上書きされます。 Gauche ネイティヴの format を使いたければ、srfi.29.bundle だけを使うようにしてください。



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