從gettext來看linux下程式的internationalization

來源:互聯網
上載者:User
在看lftp的原始碼的時候,看到了程式的一開頭有這樣幾句代碼:

setlocale (LC_ALL, "");
setlocale (LC_NUMERIC, "C");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);

註:PACKAGE, LOCALEDIR都是宏,在autoconf的時候自動產生,PACKAGE宏就是lftp, LOCALEDIR就是/usr/share/locale

不明白有什麼用,於是查了一下資料,寫了一個測試程式,搞明白了。

setlocale是用來設定程式的locale的。程式可以設定任何自己喜歡的locale,但是一般linux下的程式都寫成 setlocale(LC_ALL, "");這樣的形式,這表示:程式的locale從環境變數中繼承。setlocale這個函數本來是用來設定程式的locale的,第一個參數 LC_ALL表示要修改所有的locale變數(LANG, LC_CTYPE...),第二個參數就是要設定成什麼locale。這裡第二個參數是"",就表示locale資訊從環境變數中繼 承,setlocale以此檢查LC_ALL環境變數是否設定了,如果沒有依次往下檢查,直到最後檢查LANG環境變數。所以,簡言之,這個函數的調用表 示程式繼承環境變數中的locale設定。這樣就可以保證,英文的linux系統將來看到的介面是英文的,中文的linux系統運行這個程式就能看到中文 的介面(當然,需要後面繼續做工作)。

bindtextdomain用來設定一個給定的msgdomain,在哪個目錄下尋找msg domain file。這個可以通過gettext編程來理解。linux下的i18n其實和java的差不多,就是代碼中寫的字串,可以用xgettext這個工 具摘出來,然後形成pot檔案(portable object template),然後用命令msginit加工成po檔案,最後用msgfmt將po變成mo(二進位的檔案),mo就儲存所有的文本資源資訊,就像 java裡面的properties檔案一樣。我們需要做的就是在po檔案中,將對應英文的字串翻譯成中文的,最後程式運行,根據locale的設定, 去顯式不同的字串出來,這樣就實現i18n了,很簡單,right?

textdomain是用來設定當前的msgdomain的,msgdomain就可以理解成本程式使用的資源檔(mo檔案)的名字,只不過需 要.mo副檔名而已。比如我們的程式資源檔是hello.mo,放在了/usr/share/locale/zh_CN/LC_MESSAGES目錄 下,那麼:

#define PACKAGE "hello"
#define LOCALEDIR "/usr/share/locale"

bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);

那麼,bindtextdomain首先就是表示遇到要尋找hello這個msgdomain,要到/usr/share/locale下去找; 而textdomain就顯式的設定當前的msgdomain是hello,程式啟動的時候,msgdomain是一個名為message的字串,而 且,多個程式互相調用的時候(一個程式調用另外一個程式),他們的msgdomain都不一樣,所以需要用textdomain來顯式的指出本程式使用的 msgdomain。

這樣就清楚了吧?做到了上面的內容,也有了mo檔案了,那麼,將來代碼中只需要把字串前面都套上一個gettext這個函數就可以實現i18n了,比如:

cout << "Hello, world" << endl;

改成:

cout << gettext("Hello, world") << endl;

這樣,我們只需要準備不同locale的mo檔案,放在恰當的/usr/share/locale的子目錄下,然後設定好locale的環境變數,就可以讓hello world變成不同語言的hello world了!

詳細的gettext的做法有一篇文章,放在附件中(名為GuideArticle.txt)。此外,我寫的gettext的一個測試程式也在附件中,可以參閱。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.