Previous Next Table of Contents

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

--------------------------------------------------------------------
내가 만약 catopen("/etc/locale/msg.cat",MCLoadBySet); 와 같이 절대 경로를 사용하면 옳은 결과를 얻어내지만 위처럼 사용하면 결과값 -1 즉 실패하게 된다.

8.2 msgcat 답변

이 질문은 지난 섹션에서 답변이 된 문제이긴 하지만 몇 가지 부가적인 정보를 말할 기회라고 생각한다.

여러분의 메세지 목록을 넣을 수 있는 곳은 아주 많다. 환경변수에서 NLSPATH를 명시적으로 설정하지 않았다 하더라도 다음과 같이 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
따라서 다음 중 하나를 세팅해주면 :

$ 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 로케일을 설치하지 않았다면 제대로 동작하지 않는다. 왜냐하면 setlocale 가 실패하여 catopen 루틴의 "%L" 을 en_CA 가 아닌 "C" 로 교체 하기 때문이다.


Previous Next Table of Contents