5. Non GNU vs GNU

GNU version 의 gettext 인지 아닌지에 따라 차이점이 있다고 언급했다. 실제로는 이 차이때문에 message 변환이 안되기도 한다.

그 차이점은 messages.po 파일의 format 에 있다. non GNU version 의 gettext 를 사용하게 될때면 앞절에서 작성한 것처럼 msgid, msgstr 의 쌍으로도 충분하다. 그렇지만 GNU version 의 gettext 에서는 위처럼 해서는 원하는 결과를 얻을수없다.

xgettext 로 만들어진 messages.po 를 보자

non GNU messages.po

domain "messages"
# File:Hello.c, line:22, textdomain("Hello");
msgid  "Greeting"
msgstr
msgid  "Hello"
msgstr
msgid  "World!"
msgstr

GNU messages.po

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2002-11-13 15:09+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: Hello.c:26
msgid "Greeting"
msgstr ""

#: Hello.c:29
msgid "Hello"
msgstr ""

#: Hello.c:32
msgid "Wolrd!"
msgstr ""

GNU messages.po 에서는 사용자가 수정해주어야 할 사항들이 몇가지 더 있다. 기본 정보 이외에 CHARSET 을 지정해주어야 한다. 한국어 일 경우는 euc-KR 로 지정해 주어야 안전하다.

GNU 이냐 아니냐에 따라 작성법은 그다지 다르지 않다. 중요한것은 빌드 방법이다. GNU gettext 를 사용한다면 xgettext, msgfmt 도 GNU version 을 사용하여야 한다. non GNU gettext 를 사용한다면 역시 xgettext, msgfmt 도 gettext 와 같은 것을 사용하여야 한다. 그리고 C code 일 경우에는 빌드 할때 링크될 라이브러리를 직접 명시해 주는것이 안전하다. (GNU 일때는 GNU 라이브러리, non GNU 라이브러리 일때는 해당 라이브러리)

# example
shell> gcc Hello.c -o Hello -lintl