[再録] 議論: エラーメッセージを返す
記録のため、かつて考察した内容を書き留めておきます。
現在の実装は、以下の記述とは異なり、
1メッセージ1ファイルのテンプレートファイルの集合体です。
MLドライバは、適宜、エラーメッセージを送信者に返す必要があります。
そしてエラーメッセージは送信者の言語依存でないといけないでしょう。
よって、
多国語化対応と適切な文字コード変換をしてから送り出す必要があります。
そして、そのための処理関数群が必要です。
&fml4; の場合
&fml4; には
Mesg(*e, キーワード, デフォルトのメッセージ, 変換に使う引数);
の形で呼び出すメッセージ処理関数がありました。
Mesg() は
/usr/local/fml/messages/Japanese/
以下にあるファイル群に対して、
キーワード検索を行なっています。
各ファイルには、
カテゴリごとに分類されたキーワードとメッセージが定義されています。
つまり各ファイルに複数のキーワードが定義されていました。
たとえば、
キーワードが not_found の場合、
/usr/local/fml/messages/Japanese/kern
ファイルの not_found という欄が該当します。
あまり素敵な仕様ではありませんでした。
だからといって、locale が素敵というわけでもないのですが…
&fml8; では、どうするべきか?
一つのファイルに一つのキーワードを持つのと、
カテゴリごとに複数のキーワードを持つのとでは、
どちらがカスタマイズしやすいでしょうか?
この議論の決定打は、ないように思えます。
X/Open Portability Guide Issue 4 Version 2 (``XPG4.2'')
XPG (X/Open の規格)を使う場合は
catgets(catd, set_id, msg_id, char *s);
で、LOCALE_○○ で指定された言語へ変換しています。
ここで s はデフォルトのメッセージとなります。
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 のメッセージを元にメッセージを生成しています。
&fml8; とりあえずの方針
言語問題の一つは 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
などと 200 〜 300 個のファイルが作られることになります。
この方法の問題点は
ファイルがバラバラになる
(逆に長所として、カスタマイズしやすくなる)
ファイルがバラバラになることで locale ぽくなくなるが?
locale 対応を考えると面倒じゃないだろうか?
あたりにあるでしょう。
もっとも、
複数のファイルから一つのファイルを合成するのは簡単なので、
細かい単位になっていることは、そんなに問題ないのかもしれません。
また、
各メッセージテンプレートはどのようなものであるべきでしょうか?
後者の場合、
sub not_found
{
my .. = @_;
return <<"_EOF_"
$sender はどうーたら
_EOF_
}
といった関数をたくさん作ることもできます。
つまり、
単なる引数ではなく、
意味の分かりやすいものにすることを考えたわけです。
しかし、これは本当にカスタマイズしやすいでしょうか?
locale 化を考えるなら、これはこれで面倒な気がするわけですが…