[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

[再録] 議論: エラーメッセージを返す

Caution

記録のため、かつて考察した内容を書き留めておきます。 現在の実装は、以下の記述とは異なり、 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_○○ で指定された言語へ変換しています。 [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 のメッセージを元にメッセージを生成しています。

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 化を考えるなら、これはこれで面倒な気がするわけですが…

Notes

[1]

ここで s はデフォルトのメッセージとなります。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >