Następna strona Poprzednia strona Spis treści

8. Pytania i odpowiedzi.

Sekcja ta mogłaby urosnąć i zmienić się w FAQ, ale jest jeszcze za mała.

8.1 msgcat

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".


Następna strona Poprzednia strona Spis treści