次のページ 前のページ 目次へ

8. Q & A

このセクションは FAQ に成長するかもしれませんが、本当はまだそうではあ りません。

8.1 msgcat の質問

私は LINUX のユーザで、以下のテストプログラムを書きました:

--------------------------------------------------------------------
#include <stdio.h>
#include <locale.h>
#include <features.h>
#include <nl_types.h>

main(int argc, char ** argv)
{
        nl_catd catd;

        setlocale(LC_MESSAGES, "");
        catd = catopen("msg", MCLoadBySet);
        fprintf(stderr,catgets(catd, 1, 1, "locale message fail\n"));
        catclose(catd);
}
--------------------------------------------------------------------
$ msg.m
$set 1

1 locale message pass\n
--------------------------------------------------------------------

もし catopen("/etc/locale/msg.cat",MCLoadBySet); のように catopen で絶対パスを使えば、正しい結果が得られます。しかし、 上の例のようにすると catopen は -1 を返します(失敗します)。

8.2 msgcat の答え

この質問については前のセクションがある程度答になっていますが、もう少し 付け加えておきます。

メッセージをカタログに置くのに適切な場所はたくさんあります。(メッセー ジ・カタログの場所を設定する) NLSPATH 環境変数が明示的に設定 されていなくても、libc の中で次のように定義されてます:

$ strings /lib/libc.so.5.2.18 | grep locale | grep %L
/etc/locale/%L/%N.cat:/usr/lib/locale/%L/%N.cat:/usr
/lib/locale/%N/%L:/usr/share/locale/%L/%N.cat:/usr/
local/share/locale/%L/%N.cat

これができたら次のうちの1つをやってみてください:

$ export LC_MESSAGES=en_CA
$ export LC_ALL=en_CA
$ export LANG=en_CA

メッセージ・カタログが次のどれかにコピーされているなら、上記の NLSPATH と指定された環境で、catopen("msg", MCLoadBySet); はうまく動く でしょう。

/etc/locale/en_CA/msg.cat
/usr/lib/locale/en_CA/msg.cat
/usr/lib/locale/msg/en_CA
/usr/share/locale/en_CA/msg.cat
/usr/local/share/locale/en_CA/msg.cat

しかし、もし en_CA locale がインストールされていなければ、 setlocale は失敗するためにうまくいかず、catopen ルーチンで (en_CA ではなく) "C" が "%L" に代入されるでしょう。


次のページ 前のページ 目次へ