<!--
   $FML: discussion.sgml,v 1.8 2010/03/18 20:28:05 fukachan Exp $
-->


<sect1 id="send.back.error.messages">
	<title>
	議論: エラーメッセージを返す
	</title>

<para>
ＭＬドライバは、適宜、エラーメッセージを送信者に返す必要があります。
そしてエラーメッセージは送信者の言語依存でないといけないでしょう。
</para>

<para>
よって、
多国語化対応と適切な文字コード変換をしてから送り出す必要があります。
そして、そのための処理関数群が必要です。
</para>


<!-- ===================================================== -->
<sect2>
	<title>
	&fml4; の場合
	</title>

<para>
&fml4; には
<screen>
   Mesg(*e, キーワード, デフォルトのメッセージ, 変換に使う引数);
</screen>
の形で呼び出すメッセージ処理関数がありました。
</para>

<para>
Mesg() は /usr/local/fml/messages/Japanese/ 以下にあるファイル群に対し
て、キーワード検索を行ないます。各ファイルにはカテゴリごとに分類された
キーワードとメッセージが定義されています。
つまり各ファイルに複数のキーワードが定義されています。
</para>

<para>
たとえば、キーワードが not_found の場合、
/usr/local/fml/messages/Japanese/kern
ファイルの not_found という欄が該当します。
</para>

<para>
あまり素敵なものではありませんでした。
といって、locale が素敵というものでもないですなぁ…
</para>

</sect2>



<!-- ===================================================== -->
<sect2>
	<title>
	&fml8; では、どうするべきか？
	</title>

<para>
一つのファイルに一つのキーワードを持つのと、
カテゴリごとに複数のキーワードを持つのとどちらが
カスタマイズしやすいのでしょうか？
僕には良くわかりません。
</para>

<sect3>
   <title>
    X/Open Portability Guide Issue 4 Version 2 (``XPG4.2'')
   </title>

<para>
XPG (X/Open の規格)を使う場合は
<screen>
catgets(catd, set_id, msg_id, char *s);
</screen>
で、LOCALE_○○ で指定された言語へ変換しています。
	<footnote>
	<para>
	ここで s はデフォルトのメッセージとなります。
	</para>
	</footnote>
locale の使い方は次のようなかんじです。
<screen>
printf(catgets(catd, 30,  4,  "%s: Internal match error.\n"), progname);
</screen>
この時、catgets() は
locale の定義ファイル(
例: /usr/pkg/share/nls/ja_JP.EUC/プログラム名.cat
)
の中の se 30、エントリ 4 のメッセージを元にメッセージを生成しています。
</para>

</sect3>

<sect3>
   <title>
   &fml8; とりあえずの方針
   </title>

<para>
言語問題の一つは locale に対応するか？という問題です。
makefml を筆頭に、
各種コマンド群のエラーメッセージの日本語化を考えると、
locale を考えておくのも悪くはないのかとも思います。
この場合は locale ぽくするために
<screen>
/usr/local/lib/fml/バージョン/messages/ja_JP.EUC/kern

1: %s は見つかりません
2: %s は %d のエラーです
</screen>
といったものにしておくと後で便利そうです。
</para>

<para>
逆に、一つのキーワードごとに別のファイルにしておく構成も可能です。
これは特定の一つのキーワードだけ変えたい場合に便利そうです。
</para>

<para>
もし、後者の方法を試してみることにすると、
<screen>
FML::Message::ja::キーワード
</screen>
というクラスをじゃんじゃん作るような作り方になるでしょう。
たとえば
<screen>
FML::Message::ja::not_found
</screen>
などと 2、300 個のファイルが作られることになります。
</para>

<para>
この方法の問題点は
<itemizedlist>
   <listitem>
	<para>
        ファイルがバラバラになる
        (逆に長所としてカスタマイズしやすくなる)
	</para>
   </listitem>

   <listitem>
	<para>
        ファイルがバラバラになることで locale ぽくなくなるが？
        locale 対応を考えると面倒じゃないだろうか？
	</para>
   </listitem>

</itemizedlist>
あたりにあるでしょう。
</para>

<para>
まぁ複数のファイルから一つのファイルを合成するのは簡単なので、
ばらしておいて問題ないとも考えられます。
</para>

<para>
また、各メッセージテンプレートはどのようなものであるべきだろうか？
後者の場合、
<screen>
sub not_found
{
   my ..  = @_;

   return <<"_EOF_"
$sender はどうーたら
_EOF_
}
</screen>
といった関数を一杯作ることもできます。
つまり単なる引数ではなく意味の分かりやすいものにすることを考えたわけです。
しかし、これは本当にカスタマイズしやすいでしょうか？
locale 化を考えるなら、これはこれで面倒な気がするわけですが…
</para>

</sect3>

</sect2>

</sect1>
