다음 이전 차례

8. 질문과 답

이 섹션은 지금으로서는 FAQ 라고 할 수 없겠지만 앞으로 FAQ 로 자라날 것이다.

8.1 msgcat 질문

나는 리눅스 사용자이며 다음과 같은 시험 프로그램을 만들었다.


       #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

If I use absolute path in catopen like

내가 만약 catopen("/etc/locale/msg.cat",MCLoadBySet); 와 같이 절대 경로를 사용하면 옳은 결과를 얻어내지만 위처럼 사용하면 결과값 -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

따라서 다음 중 하나를 세팅해주면 :
     $ 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

This, however, will not work if you don't have the en_CA locale

하지만 여러분이 en_CA 로케일을 설치하지 않았다면 제대로 동작하지 않는다. 왜냐하면 setlocale 가 실패하여 catopen 루틴의 %L을 en_CA 가 아닌 C 로 교체 하기 때문이다.


다음 이전 차례