MLドライバは、適宜、エラーメッセージを送信者に返す必要があります。 そしてエラーメッセージは送信者の言語依存でないといけないでしょう。
よって、 多国語化対応と適切な文字コード変換をしてから送り出す必要があります。 そして、そのための処理関数群が必要です。
fml4 には
Mesg(*e, キーワード, デフォルトのメッセージ, 変換に使う引数);の形で呼び出すメッセージ処理関数がありました。
Mesg() は /usr/local/fml/messages/Japanese/ 以下にあるファイル群に対し て、キーワード検索を行ないます。各ファイルにはカテゴリごとに分類された キーワードとメッセージが定義されています。 つまり各ファイルに複数のキーワードが定義されています。
たとえば、キーワードが not_found の場合、 /usr/local/fml/messages/Japanese/kern ファイルの not_found という欄が該当します。
あまり素敵なものではありませんでした。 といって、locale が素敵というものでもないですなぁ…
一つのファイルに一つのキーワードを持つのと、 カテゴリごとに複数のキーワードを持つのとどちらが カスタマイズしやすいのでしょうか? 僕には良くわかりません。
XPG (X/Open の規格)を使う場合は
catgets(catd, set_id, msg_id, char *s);で、LOCALE_○○ で指定された言語へ変換しています。 [1] locale の使い方は次のようなかんじです。
printf(catgets(catd, 30, 4, "%s: Internal match error.\n"), progname);この時、catgets() は locale の定義ファイル( 例: /usr/pkg/share/nls/ja_JP.EUC/プログラム名.cat ) の中の se 30、エントリ 4 のメッセージを元にメッセージを生成しています。
言語問題の一つは locale に対応するか?という問題です。 makefml を筆頭に、 各種コマンド群のエラーメッセージの日本語化を考えると、 locale を考えておくのも悪くはないのかとも思います。 この場合は locale ぽくするために
/usr/local/lib/fml/バージョン/messages/ja_JP.EUC/kern 1: %s は見つかりません 2: %s は %d のエラーですといったものにしておくと後で便利そうです。
逆に、一つのキーワードごとに別のファイルにしておく構成も可能です。 これは特定の一つのキーワードだけ変えたい場合に便利そうです。
もし、後者の方法を試してみることにすると、
FML::Message::ja::キーワードというクラスをじゃんじゃん作るような作り方になるでしょう。 たとえば
FML::Message::ja::not_foundなどと 2、300 個のファイルが作られることになります。
この方法の問題点は
ファイルがバラバラになる (逆に長所としてカスタマイズしやすくなる)
ファイルがバラバラになることで locale ぽくなくなるが? locale 対応を考えると面倒じゃないだろうか?
まぁ複数のファイルから一つのファイルを合成するのは簡単なので、 ばらしておいて問題ないとも考えられます。
また、各メッセージテンプレートはどのようなものであるべきだろうか? 後者の場合、
sub not_found { my .. = @_; return <<"_EOF_" $sender はどうーたら _EOF_ }といった関数を一杯作ることもできます。 つまり単なる引数ではなく意味の分かりやすいものにすることを考えたわけです。 しかし、これは本当にカスタマイズしやすいでしょうか? locale 化を考えるなら、これはこれで面倒な気がするわけですが…
[1] | ここで s はデフォルトのメッセージとなります。 |
author's homepage is www.fml.org/home/fukachan/.
Also, visit nuinui's world :) at www.nuinui.net.
For questions about FML, e-mail <fml-bugs@fml.org>.