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 はエンコーディングのようなそのほかの情報を指定します。
デフォルトのバンドル指定子の値は以下のようなパラメータで取得可能です。
[SRFI-29]{srfi.29
}
current-language
および current-country
パラメータは
ISO 639-1 の言語コードと ISO 3166-1 の国コードをそれぞれシンボルで
保持しています。current-locale-details
はエンコーディングのような
補助的な地域情報のリストを保持しています。
これらのパラメータは、環境変数 LANG
が lang_country.encoding
フォーマットの形式で設定されていれば、初期化されます。たとえば、
LANG
が ja_JP.eucJP
に設定されていれば、それらの
パラメータはそれぞれ ja
、jp
、(eucjp)
に設定されます。
LANG
が C
であるかあるいは定義されていなければ、
デフォルト値は、それぞれ en
、us
、()
です。
[SRFI-29]{srfi.29
}
テンプレートキー(シンボル)と特定ロケールのメッセージ(文字列)の連想リストを
bundle-specifier をキーとして、バンドルデータベースに入れます。
Gauche は現在のところメモリ上のバンドルデータベースのみサポートしています。
つまり、地域化されてメッセージを探しあてるには、そのアプリケーション内で
declare-bundle!
を呼ぶ必要があるということです。
[SRFI-29]{srfi.29
}
Gauche は今のところ永続バンドルデータベースをサポートしていないので、
これらの手続きはなにもせず #f
を返します
(これはいまのところ srfi-29 の振舞いと適合しています)。
[SRFI-29]{srfi.29
}
地域化されたメッセージを検索します。当該メッセージは
package-name パッケージの中で、message-template-name
シンボルと関連つけられています。
[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.bundle
と
srfi.29.format
を拡張する srfi.29
を使うと、format
手続きは SRFI-29 の format
でそのモジュール内で上書きされます。
Gauche ネイティヴの format
を使いたければ、srfi.29.bundle
だけを使うようにしてください。