在Linux下开发多语言软件: Hello GetText!
轉自:http://www.groad.net/bbs/read.php?tid-906.html
開發多語言軟件是一件非常困難的事,各個國家的字符集的編碼方式、貨幣符號、日期格式、數字格式、文字表現都各不相同,glibc提供了大量的函數處理這些事情,不再聱述了。這里要做的是,用一個簡單的實例說明一下GetText 的用法,GetText是一系列的工具和庫函數,幫助程序員和翻譯人員開發多語言軟件的。
GetText 并不是一個神秘的東西,若非要在Win32下找一個東東與之對應的話,我想應該是資源文件(.res),它替你把字符串管理起來,在運行時可以根據當前的語言,自動加載對應語言的字符串。
這里假設要開發一個叫做 foonly 的軟件包,它僅有一個源文件foonly.c,其功能是在屏幕上打印出”Hello, GetText!”。在沒有支持多語言時,foonly.c的內容如下:
好了,下面開啟我們多語言軟件的開發之旅:
創建 pot 文件,pot 是 Portable Object Template的首字母縮寫,與 po 對應的是 mo,mo 是Machine Object的首字母縮寫。前者意指原始的字符串文件,一般用于給翻譯人員去修改的,后者則是與機器相關的,一般是供程序讀取。可以手工創建 pot 文件,也可以通過 xgettext 從代碼中抽取字符串來產生。這里是用 xgettext來產生的:
運行該命令后,我們發現,在當前目錄下,產生了一個名foonly.pot的文件,打開該文件,可以看到:
# 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: 2005-11-07 20:06+0800\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" #: foonly.c:5 msgid "Hello, GetText!\n" msgstr ""?根據 pot 產生不同語言的 po 文件,這里我們先產生一個簡體中文的 po 文件:
export LANG=zh_CN.gb2312 msginit -l zh_CN.gb2312 -i foonly.pot?運行該命令后,我們發現,在當前目錄下,產生了一個名 zh_CN.po 的文件,打開該文件,可以看到:
# Chinese translations for PACKAGE package. # Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # root <root@linux>, 2005. #msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2005-11-07 20:06+0800\n" "PO-Revision-Date: 2005-11-07 20:09+0800\n" "Last-Translator: root <root@linux>\n" "Language-Team: Chinese <zh-l10n@linux.org.tw>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=GB2312\n" "Content-Transfer-Encoding: 8bit\n"#: foonly.c:5msgid "Hello, GetText!\n" msgstr ""?翻譯 zh_CN.po 里對應的字符串為中文:
# Chinese translations for PACKAGE package. # Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # root <root@linux>, 2005. #msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2005-11-07 20:06+0800\n" "PO-Revision-Date: 2005-11-07 20:09+0800\n" "Last-Translator: root <root@linux>\n" "Language-Team: Chinese <zh-l10n@linux.org.tw>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=GB2312\n" "Content-Transfer-Encoding: 8bit\n"#: foonly.c:5msgid "Hello, GetText!\n" msgstr "你好,GetText!\n"?根據 po 文件生成 mo 文件:
msgfmt zh_CN.po -o zh_CN.mo?運行該命令后,我們發現,在當前目錄下,產生了一個名zh_CN.mo的文件。它是二進制的,不能用文本編輯器打開。
?安裝mo文件到系統中:
?修改程序:
#include <stdio.h> #include <locale.h> #include <libintl.h> #define _(String) gettext (String) #define LOCALEDIR "/usr/share/locale/" #define PACKAGE "foonly"int main(int argc, char* argv[]) {setlocale (LC_ALL, "");bindtextdomain (PACKAGE, LOCALEDIR);textdomain (PACKAGE);printf(_("Hello, GetText!\n"));return 0;}?編譯并運行:
gcc -g foonly.c -o foonly ./foonly?可以看到屏幕上打印出:
你好, GetText!?現在我們換成英文試一下:
export LANG=es_US ./foonly?可以看到屏幕上打印出:
Hello, GetText!?添加其它語言也很容易,不需要修改程序,只需要像對待中文一樣,生成一個 mo 文件,并安裝到系統中對應的目錄即可。切換不同的語言僅僅是修改當前的 locale就行了。
posted on 2011-11-09 21:25 林中鳥 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/zechen11/archive/2011/11/09/2243653.html
總結
以上是生活随笔為你收集整理的在Linux下开发多语言软件: Hello GetText!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 内存优化测试(转)
- 下一篇: Flash小玩意图案创作:新增MulCi