Sekcja ta mogłaby urosnąæ i zmieniæ siê w FAQ, ale jest jeszcze za mała.
Używam Linux-a i napisałem taki program:
--------------------------------------------------------------------
#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, "otwarcie komunikatów lokalnych nie powiodło siê\n"));
catclose(catd);
}
--------------------------------------------------------------------
$ msg.m
$set 1
1 locale message pass\n
--------------------------------------------------------------------
Jeśli użyjê bezwzglêdnej ścieżki dostêpu w "catopen", np.:
catopen("/etc/locale/msg.cat", MCLoadBySet);
To jest dobrze. Ale jeśli używam poprzedniego przykładu "catopen" zwraca mi -1 (czyli, że siê nie powiodło)
Czêściowa odpowiedź na to pytanie jest w poprzedniej sekcji, ale podam jeszcze trochê dodatkowych informacji.
Jest wiele "odpowiednich miejsc", gdzie możesz umieściæ katalog z komunikatami. Nawet gdybyś nie ustawił zmiennej środowiskowej NLSPATH, to jest ona nastêpująco zdefiniowana w libc:
$ strings /lib/libc.so.5.4.17 | 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
Wiêc jeśli zrobiłeś jedno z poniższych:
$ export LC_MESSAGES=en_CA $ export LC_ALL=en_CA $ export LANG=en_CA
to funkcja catopen("msg", MCLoadBySet); działałaby, gdyby
twój katalog z komunikatami był jednym z:
/etc/locale/en_CA/ /usr/lib/locale/en_CA/ /usr/lib/locale/msg/ /usr/share/locale/en_CA/ /usr/local/share/locale/en_CA/
Jednak to nie zadziała jeśli nie masz zainstalowanych ustawieñ lokalnych dla en_CA, ponieważ funkcja "setlocale" nie powiedzie siê i w wywołaniu funkcji "catopen" w miejsce "L" zostanie podstawiona litera "C".