来自: http://twpug.net/modules/smartsection/item.php?itemid=29

  • 看到一篇getext不错的文档,当然E文够好最好去官方去看文档…:)
  • 如果要实现具体的例子,可以google,或者baidu,这样的例子应该已经泛滥…

http://www.gnu.org/software/gettext/manual/gettext.html

關於 gettext (一、簡介)
由 Kiang 發佈於 2005/2/3 (3416 次瀏覽)
發信人: Platin.bbs@csie.nctu.edu.tw (小虫), 看板: Linux
標 題: [REF] 關於 gettext (一、簡介)
發信站: 交大資工鳳凰城資訊站 (Tue Jul 21 13:40:05 1998) gateway.ccafps.khc.edu.tw
轉信站: Maxwell!bbs.ee.ntu!freebsd.ntu!news.cs.nthu!news.cis.nctu!news.csie.nc

gettext 簡介

一、前言:

gettext 套件是 GNU 對訊息國際化 (i18n) 提出的解決方案;有寫過程式
的人都知道,過去大家寫程式的時候都把程式的訊息寫死在程式碼裡面,
例如說:
printf(&quotHello World!!“);

假如要把程式的訊息改成其他的語言的話,必須要取改原始碼,然後再重新
編譯,這樣的作法在國際化的時候就行不通了;GNU 的 gettext 套件就是
提出了一套標準的方法,讓程式不須重新編譯就能顯示多國的訊息,讓國際
化 (i18n) 的工作可以更簡單的達成。

gettext 現在的版本是 0.10 版,雖然說還不是 1.0 版,但是對於訊息國
際化的支援 (LC_MESSAGES) 已經算是穩定了,幾乎所有的 GNU 程式也都支
援 gettext ,因此現在把它當作一個標準,來作 Linux 上訊息中文化
的工作,應該是一個適當的時機。

二、工作原理:

底下這個流程圖可以總括 gettext 套件的工作原理:

引言:

Original C Sources ---> PO mode ---> Marked C Sources ---.
|
.---------<--- GNU gettext Library |
.- - make <---+ |
| `---------<--------------------+-----------'
| |
| .-----<--- PACKAGE.pot <--- xgettext <---' .---<--- PO Compendium
| | | ^
| | `---. |
| `---. +---> PO mode ---.
| +----> tupdate -------> LANG.pox --->--------' |
| .---' |
| | |
| `-------------<---------------. |
| +--- LANG.po <--- New LANG.pox <----'
| .--- LANG.gmo <--- msgfmt <---'
| |
| `---> install ---> /.../LANG/PACKAGE.mo ---.
| +---> &quotHello world!”
`-------> install ---> /.../bin/PROGRAM -------'

這個圖是從 GNU 的 info page 剪下來的,它說的比較複雜;我底下再用
簡單的程序說明:

要讓你的程式支援國際化,程式設計師在寫程式時必須標出要國際化的訊
息,就是要被翻譯成他國文字的訊息;比如說,“%s %d” 這樣的字串是不
必被翻譯的,而 &quotHello World!!“ 就需要標示出來,標示方法如下:

printf(gettext(&quotHello World”));

在這裡懂 C 的朋友就可以看出來,程式在印出訊息時,並不是直接取得
訊息的字串,而是透過一個 gettext 函式來獲得字串;這個 gettext 函
式在程式真正被執行時,會檢查 locale 的情況 (事實上是檢查 LC_ALL 或
LC_MESSAGES 或 LANG 這環境變數),然後以 gettext 的參
數 ( &quotHello World“ )作為一個 id key,去訊息資料庫裡面抓合
乎 locale 設定的訊息,這樣子同一個程式,就可以 show 出許多不同語言
的訊息了!!
這就是上面 Original C Sources -> PO mode —> Marked C Sources –
–> make –> install —> /…/bin/PROGRAM —> &quotHello world!”
這一段流程,是程式設計師的工作,也是程式 i18n 的過程。

那訊息資料庫是甚麼??要怎麼作呢??
gettext 套件裡面有一個程式叫 xgettext,他可以用來處
理 Marked C Sources,把原始碼裡面有標記的訊息抓出來,產生一個
.pot 檔 (Portable Object Template),它的格式大約如下:

: hello.c:22

msgid &quotHello, World!!“
msgstr ”“

‘#’ 開頭的行是註解,msgid 欄位是原先的訊息,msgstr 就是用
來填翻譯過的訊息的,我們可以把翻譯過的訊息填進去,製造出一
個 po 檔;在上面的流程裡面,大家可以看到有一個 .pox 檔;這是
GNU 建議對還沒完全翻譯好的 po 檔的稱呼,.pox 是施工中的,等到
完工定案了,再把它改成 .po 檔。

另外,或許你想要動手翻譯的程式已經有舊版的 .po 訊息檔了,我們
當然不希望把已經翻譯過的訊息再打一次,這時就可以用 &quottupdate” 這
個程式來把舊的 .po 檔裡面的訊息合併進來。

作好 .po 檔以後,就可以用 &quotmsgfmt“ 這個程式來把 .po 檔變成真正的
機器可以處理的 .mo 檔 (Machine Object);這個 .mo 檔就是真正的訊息
資料庫檔案,它會被放到你的 LOCALEDIR 裡面去,RedHat-5.0 的話,就
是在 /usr/share/locale/*/LC_MESSAGES/ ,* 就是 locale 的名稱,也就
是你在環境變數 LC_ALL or LANG or LC_MESSAGES 裡面指定的字串,比如說
你 export LC_ALL=zh_TW.BIG5 的話,那程式執行時,gettext 就會去
/usr/share/locale/zh_TW.BIG5/LC_MESSAGES/ 底下找訊息檔,找到的話,
你就可以看到中文啦!!… :)

這個部份可以慨括如下:

xgettext editor msgfmt (install)
source code –> .pot –> .pox –> .gmo –> .mo –> &ltrun time>

.gmo 就是 .mo 檔,他是 GNU 建議用來稱呼還沒安裝到定位的 .mo 檔,
表示是由 Gnu gettext 套件產生的。

這一段工作不必要由程式設計師來完成,是屬於 l10n 的工作,理論上
該由世界各地使用不同語言的人來自願當翻譯的工作。

所以這就是我們可以出力的地方了。 :)

转载请注明:韦旭红的点点滴滴 » 關於 gettext (一、簡介)(转)