日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 的中文化問題簡介( 六 )





訊息輸出;(詳見;info;gettext):;
一般我們程式的訊息輸出,是經(jīng)由;stdio.h;頭的函式,直接輸出到;stdout;或;stderr,;而輸出的內(nèi)容是直接寫死在程式碼中 。這樣的程式要做多國語文化會(huì)造成困擾,因?yàn)槲覀儽仨氁薷脑即a,將所有的訊息字串翻譯成另一種語文 。因此,我們必須透過;locale;的;LC_MESSAGES;來處理訊息輸出 。其原理很簡單,就是將程式中的所有訊息抽離出來,為每一個(gè);locale;分別做好一個(gè)訊息檔,當(dāng)程式要輸出訊息時(shí),則透過;libc;的函式依目前的;locale;去正確的訊息檔中抓取訊息 。;

在此我用;GNU;gettext;為例,簡單說明其原理 。在;/usr/share/locale;中,頭有各種;locale;的資料目錄 。而每個(gè)目錄下,都會(huì)有一個(gè);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;這個(gè)程式的日文訊息,而;zh_TW.Big5/;下的;prog.mo;就是;prog;這個(gè)程式的中文訊息 。假設(shè)在還沒加入;LC_MESSAGES;支援之前,;prog.c;長得像這樣:;


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

#include;

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


--------------------------------------------------------------------------------
現(xià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;中設(shè)定的;*/
printf(_("This;is;a;test;string.n"));
/*;使用;gettext;來抓出訊息,再交給;printf;來印;*/
}


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

如果在指定的;locale;下找不到;prog.mo;檔,則程式就直接以原英文訊息印出 。因此,加入;LC_MESSAGES;的支援,原;source;code;修改并不多,其實(shí)相當(dāng)方便 。;

比較麻煩的是各;locale;下的訊息檔作,而這些步驟可以經(jīng)由;GNU;gettext;套件很容易地達(dá)成,其步驟簡述如下;(詳見;info;gettext):;

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

(節(jié)錄自;Platin.bbs@csie.nctu.edu.tw;的文章:
[REF];關(guān)於;gettext;(一、簡介))

使用;xgettext;產(chǎn)生;.pot;檔:;
xgettext;-a;-o;prog.pot;prog.c;

而;prog.pot;檔的內(nèi)容如下:;
--------------------------------------------------------------------------------

#;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;""


--------------------------------------------------------------------------------
各位可以注意到倒數(shù)兩行,;msgid;就是原來;source;頭的英文訊息,而我;們可以直接在;msgstr;中將原訊息翻譯成中文 。所以,接下來的工作其實(shí)就;是翻譯,我們可以用任意的編輯器編輯這個(gè)檔案,并將翻譯好的檔案存成;prog.pox;檔 。;


將;prog.pox;編譯成;prog.gmo:;
msgfmt;-o;prog.gmo;prog.pox

推薦閱讀