Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagecpp
#define THIS_PACKAGE_NAME "hello"

// 기본 locale 사용 안 함
setlocale (LC_ALL, "");

// 패키지 이름. locale 이름의 폴더 밑에 hello.mo 가 있어야 함.
bindtextdomain (THIS_PACKAGE_NAME, locale_dir);
textdomain (THIS_PACKAGE_NAME);

// 번역되서 보여질 부분은 gettext 로 감싸줌
printf(gettext("My name is %s.\n"), my_name);

// gettext 대신 _ macro 사용해도 됨.
printf(_("my age is %d.\n"), my_age);


2. 소스 수정이 끝났으면 소스에서 gettext 로 표시한 부분을 추출해 주는 xgettext 를 이용해서 메시지를 추출한후에 저장합니다. 아래는 추출한 메시지 파일을 hello.pot 로 저장하는 예제입니다.

...

Code Block
languagebash
$ mkdir -p locale/ko/LC_MESSAGES/
$ msgfmt ko.po -o locale/ko/LC_MESSAGES/hello.mo -l ko_KR.utf8
Note

locale 용 데이터가 실행 파일(hello)이 있는 폴더의 하위에 locale/LOCALE/LOCALE_TYPE/ 경로로 있을 경우입니다.


이제 locale 을 변경없이 hello 를 실행하면 기본 설정인 영어로 표시됩니다.

Code Block
languagebash
$ ./hello john 50 

my name is john.
my age is 50.


제대로 동작하는지 확인하기 위해 locale 을 ko_KR 로 설정하고 locale 명령어로 확인해 봅니다.

Code Block
$ export LANG=ko_KR
$ locale

LANG=ko_KR
LC_CTYPE="ko_KR"
LC_NUMERIC="ko_KR"
LC_TIME="ko_KR"
LC_COLLATE="ko_KR"
LC_MONETARY="ko_KR"
LC_MESSAGES="ko_KR"
LC_PAPER="ko_KR"
LC_NAME="ko_KR"
LC_ADDRESS="ko_KR"
LC_TELEPHONE="ko_KR"
LC_MEASUREMENT="ko_KR"
LC_IDENTIFICATION="ko_KR"
LC_ALL=


다시 hello 를 실행하면 메시지가 한글로 표시되는 걸 확인할 수 있습니다.

Code Block
languagebash
$ ./hello 똠방 50

내 이름은 똠방입니다.
내 나이는 50입니다.

C 언어 예시

국제화를 지원하는 SW 를 개발할 경우 번역이 필요한 메시지 부분을 다음과 같이 getext() 로 감싸줍니다.

...