このセクションは FAQ に成長するかもしれませんが、本当はまだそうではあ りません。
私は 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 を返します(失敗します)。
この質問については前のセクションがある程度答になっていますが、もう少し 付け加えておきます。
メッセージをカタログに置くのに適切な場所はたくさんあります。(メッセー
ジ・カタログの場所を設定する) 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
"
に代入されるでしょう。