所謂的國際化,就是將讓自己的程式在不同的計算機環境中有不同的資訊提示,大的軟體如windows xp有英文版,也有中文版。小的軟體如下面的程式:
int main()如何能讓該程式在英文環境中顯示「hello, world!」
而在中文環境中顯示「世界,你好!」
?最簡單的方法是直接修改源**,重新編譯。假如該程式要有幾十種語言的版本,就要有幾十份原始碼。這非常的難於維護。於是gnu提供了gettext作為解決方案。
下面的介紹,只是入門級別的使用說明,如果你是老鳥,也歡迎指出錯誤。
本文以gcc作為編譯器,所有的環境配置都是在windows xp,dev-c++下完成,如果你使用其它的編譯器,配置略有不同,應該不會有太大的差別。
整個的環境的構建需要以下的工具:
啟動dev-c++,新建乙個空工程,然後在project|project options|parameters|linker
中加入../../../dev-cpp/lib/libintl.lib
。在該工程內新增原始碼檔案gettext_test.c
,原始碼如下:
#include #include #include只要在msgstr後面的引號中填入對應語言的翻譯即可,例如這一句可以改為:包含gettext的標頭檔案。
包含gettext的標頭檔案。
定義巨集,為了少敲幾個字元。gettext()是gettext中的乙個函式。
將系統執行的語言環境設定為程式執行的環境,在我的機器是中文環境。
告訴該程式到gettext_test.mo中去找輸出語言的資訊。關於gettext_test.mo是什麼,下面要講到。
告訴程式到當前目錄的
language
目錄下去找gettext_test.mo檔案。該程式和背景說明章節中的程式有明顯的不同是把所有的字串資訊用_()包圍起來,實際上是把它們作為gettext()的引數。編譯執行該程式, 假定該程式名是gettext_test.exe,如果直接執行gettext_test.exe,它會輸出英文本串提示引數不夠,給出程式的使用方 法。
可是這個國際化還差很遠啊,是的,下面還有一系列的工作要作:
在原始碼gettext_test.c的目錄下執行xgettext --keyword=_ -o gettext_test.po gettext_test.c,就會得到乙個文字檔案gettext_test.po。
#: gettext_test.c:26
#, c-format
msgid "usage: %s username/n"
msgstr ""
#: gettext_test.c:26儲存好翻譯後執行命令:msgfmt -o language/zh_cn/lc_messages/gettext_test.mo gettext_test.po。這樣就生成了語言包的二進位制格式,根據程式中的設定,該程式會到當前目錄的language子目錄中尋找語言包,所以gettext_test.po最終放置的位置是當前目錄#, c-format
msgid "usage: %s username/n"
msgstr "使用方法:%s 使用者名稱/n"
/language/zh_cn/lc_messages
。zh_cn表示中文,如果你建立了如法文等其它的語言包,還需要建立fr目錄等。
再次執行程式,看看輸出的資訊是不是中文的?應該是。
親手打造 gnu/linux 中文環境 (五) - 訊息國際化的解決方案謝東翰 ,小蟲
利用gettext來實現PHP的國際化程式設計
domain echo bindtextdomain domain this will output hello.php i18n 程式範例開始 define package hello 定義要用的mo檔名稱,常規來說,我們都把package的名稱定義和程式名稱相同。putenv lang zh t...
IOS程式國際化
1.2 新建後,可以看到工作目錄結構檔案如下,單擊infoplist.strings,檢視右邊的屬性,在localization欄新增語言。1.3 新增完成後開啟對應語言檔案,比如english的新增 cfbundledisplayname china chinese檔案新增 cfbundledis...
IOS程式國際化
1.2 新建後,可以看到工作目錄結構檔案如下,單擊infoplist.strings,檢視右邊的屬性,在localization欄新增語言。1.3 新增完成後開啟對應語言檔案,比如english的新增 cfbundledisplayname china chinese檔案新增 cfbundledis...