Linux 的中文化问题简介( 六 )





讯息输出;(详见;info;gettext):;
一般我们程式的讯息输出,是经由;stdio.h;头的函式,直接输出到;stdout;或;stderr,;而输出的内容是直接写死在程式码中 。这样的程式要做多国语文化会造成困扰,因为我们必须要修改原始码,将所有的讯息字串翻译成另一种语文 。因此,我们必须透过;locale;的;LC_MESSAGES;来处理讯息输出 。其原理很简单,就是将程式中的所有讯息抽离出来,为每一个;locale;分别做好一个讯息档,当程式要输出讯息时,则透过;libc;的函式依目前的;locale;去正确的讯息档中抓取讯息 。;

在此我用;GNU;gettext;为例,简单说明其原理 。在;/usr/share/locale;中,头有各种;locale;的资料目录 。而每个目录下,都会有一个;LC_MESSAGES;的目录,而这些目录就是用来放各别程式的讯息档 。例如:;


/usr/share/locale/ja/LC_MESSAGES/prog.mo;;;(日文)
/usr/share/locale/zh_TW.Big5/LC_MESSAGES/prog.mo;;;(Big5)

其中在;ja/;目录下的;prog.mo;就是;prog;这个程式的日文讯息,而;zh_TW.Big5/;下的;prog.mo;就是;prog;这个程式的中文讯息 。假设在还没加入;LC_MESSAGES;支援之前,;prog.c;长得像这样:;


--------------------------------------------------------------------------------

#include;

main()
{
printf("This;is;a;test;string.n");
}


--------------------------------------------------------------------------------
现在我们要用;gettext;来加入支援,则程式只要改成:;
--------------------------------------------------------------------------------

#include;

#include;

#define;_(STRING);gettext(STRING)
#define;PACKAGE;"prog"

main()
{
setlocale(LC_MESSAGES,;"");
textdomain(PACKAGE);
/*;这就是指定用
/usr/share/locale/$LOC/LC_MESSAGES/prog.mo
作为讯息档 。其中;$LOC;是在;setlocale;中设定的;*/
printf(_("This;is;a;test;string.n"));
/*;使用;gettext;来抓出讯息,再交给;printf;来印;*/
}


--------------------------------------------------------------------------------

如果在指定的;locale;下找不到;prog.mo;档,则程式就直接以原英文讯息印出 。因此,加入;LC_MESSAGES;的支援,原;source;code;修改并不多,其实相当方便 。;

比较麻烦的是各;locale;下的讯息档作,而这些步骤可以经由;GNU;gettext;套件很容易地达成,其步骤简述如下;(详见;info;gettext):;

xgettext;;;;editor;;;msgfmt;;(install)
source;code;-->;.pot;-->;.pox;-->;.gmo;-->;.mo;-->

(节录自;Platin.bbs@csie.nctu.edu.tw;的文章:
[REF];关於;gettext;(一、简介))

使用;xgettext;产生;.pot;档:;
xgettext;-a;-o;prog.pot;prog.c;

而;prog.pot;档的内容如下:;
--------------------------------------------------------------------------------

#;SOME;DESCRIPTIVE;TITLE.
#;Copyright;(C);YEAR;Free;Software;Foundation,;Inc.
#;FIRST;AUTHOR;
,;YEAR.
#
#:;prog.c:8
#,;fuzzy
msgid;""
msgstr;""
"Project-Id-Version:;PACKAGE;VERSIONn"
"POT-Creation-Date:;1999-02-28;19:18 0800n"
"PO-Revision-Date:;YEAR-MO-DA;HO:MI ZONEn"
"Last-Translator:;FULL;NAME;
n"
"Language-Team:;LANGUAGE;
n"
"MIME-Version:;1.0n"
"Content-Type:;text/plain;;charset=CHARSETn"
"Content-Transfer-Encoding:;ENCODINGn"

#:;prog.c:10
msgid;"This;is;a;test;string.n"
msgstr;""


--------------------------------------------------------------------------------
各位可以注意到倒数两行,;msgid;就是原来;source;头的英文讯息,而我;们可以直接在;msgstr;中将原讯息翻译成中文 。所以,接下来的工作其实就;是翻译,我们可以用任意的编辑器编辑这个档案,并将翻译好的档案存成;prog.pox;档 。;


将;prog.pox;编译成;prog.gmo:;
msgfmt;-o;prog.gmo;prog.pox

推荐阅读