在 GNU/Linux 的系統,並不特意有中文版(或其他語言版),而是透過 i18n 的機制來達成一種系統多國使用的目的。i18n 指的就是 internationalization,國際化,取前後字母和中間字母數目合成 i18n。使用者只要調整系統的地區性環境變數就行了。底下以 bash 來說明。
這無需一個一個設定,但要注意的是 LC_ALL 這個環境變數的設定會蓋過其他的設定,致使其他的環境變數的後來設定失效,因此,通常我的系統 LC_ALL 是不設定的(可以 unset LC_ALL 取消掉他)。LANG 變數設定,如果其他(LC_ALL 除外)的變數沒有設定,那就依 LANG 的設定,如果其他的環境變數有設定,則依其他環境變數的設定,他不會蓋過其他的環境變數設定。因此,設從效力優先性是:LC_ALL > LC_* > LANG。目前的設定,可以使用 locale 這個指令得知,而系統所能支援的語系,可以由 locale -a 得知。可設定的項目及其作用請參考表 1。
| 主要的環境變數項目 | 作用 |
| LANG | 語言環境 |
| LC_CTYPE | 字元辨識 |
| LC_NUMERIC | 數字系統的顯示 |
| LC_TIME | 時間系統的顯示 |
| LC_COLLATE | 字串比較、排序 |
| LC_MONETARY | 幣值格式的顯示 |
| LC_MESSAGES | 訊息顯示,如功能表、錯誤訊息 |
| LC_ALL | 語言環境整體設定 |
有人(就是我啦!:)喜歡在英文環境下工作,但又要讓系統能真正處理中文(包括顯示、輸入及辨識中文),那只要將 LC_CTYPE 設在 zh_TW.Big5,其他的部份設成 POSIX14 就可以了,這個設定可以寫在 $HOME/.bash_profile 這個檔案中。例如:我個人的 $HOME/.bash_profile 設定如下:
... LC_ALL= LANG= LC_CTYPE=zh_TW.Big5 LC_COLLATE=C export LC_ALL LANG LC_CTYPE LC_COLLATE ...當然,也可以設定在 /etc/profile 中,讓全部的 user 都使用這個設定。但由於目前的 distro 都會預設設定好這些設定,例如 Mandrake 可以由 $HOME/.i18n 這個設定檔來設定,因此設定有疑問時,馬上要想到 locale 這個指令來檢查一下目前的地區性環境的設定,並參考系統上 /etc/profile 及 /etc/sysconfig、/etc/profile.d 目錄下有關 lang 及 i18n 的設定。
其中的 LC_COLLATE 關係到中英混合時的比較、排序的問題,因此目前建議設在 C 或 POSIX,往後中文 locale 真正完備時才完全設在 zh_TW.Big5,因為這會影響到系統 sort, ls 在排序時的行為。
這裡所謂的 i18n,不僅僅是表面上看得到的訊息,尚包括系統內部處理當地語文的過程,因此和我們一般所說的本土化並不完全相同。一般所說的本土化,指的是 l10n (localization),這純粹是把訊息翻譯成本土語文,更深入一層的指的是,能處理本土語文,並沒有把國際觀帶入,這樣的話,以國際的觀點而言,軟體開發將會使整個成本提高,而且也較不利下面會提到的多國語言化。
那 m17n(multilingualization,多國語言化)又是什麼呢?這代表系統或軟體可以同時顯示、處理多國語文,例如中、日、韓、英文同時顯示、處理。這和 i18n 又有什麼關係呢?簡單的說,i18n 的架構可以是達成 m17n 的方法之一。例如把地區性環境設為 utf8 或 UTF-8 時(視各個 distro 不同而不同),由於 Unicode 字型含有多國文字,因此就可以同時顯示、處理多國語言了。但這並不是唯一的方法,只能說是目前較「主流」的方法。
目前 i18n 架構在 GNU libc 下已經漸漸成熟,缺的是相關配合的應用軟體(已漸漸完備),大字集的 Unicode 字型,系統對 Unicode 大字集包括其字型如何有效的運用,及輸入法的配合等等問題,這有待大家一起來努力。
而以 m17n 來說,只要是在 utf8 的地區性環境下,配合 Unicode 字型,在顯示上已沒什麼問題,輸入的話就有待更流利的整合。至於單一軟體內部支援,則有 yudit,這不靠系統的幫助就可以做到 m17n(請參考圖 1 yudit Unicode 編輯器),輸入雖還沒有整合,但各種中外輸入法都可以由 table 的方式依一定簡單規則編輯、編譯出來互動切換使用。另外,GNU Emacs 也是可以做到 m17n 的功能,但這是使用 ISO-202215 的機制來達成的。Vim 的話,目前也已支援 UTF-8 編碼的文件。除了 Unicode(及其他類此的大字集方式) 及 ISO-2022 的架構外,還有沒有其他的方法達成 m17n?可能,尤其是我們由筆劃、部首組成的字集,但要到實用、主流的地步,恐怕還需要大家再努力。
如果只是簡單的想處理中文的 UTF-8 編碼文件,那可以很簡單的由 xterm 來達成,先開一個 rxvt(mlterm 亦支援 UTF-8 環境):
rxvt xterm -u8 -fn 10x20 -fw \ "-arphic-ar pl mingti2l big5-medium-r-normal--20-*-*-*-c-*-iso10646-1" export LC_ALL=zh_TW.UTF-8 vim your-big5.utf8新版的 xterm 請使用 -en UTF-8 取代 -u8,這樣就可以編輯中文的 UTF-8 編碼文件,可以由 xcin 來輸入中文。當然,這裡是利用到了 libc 中的 gconv/iconv 的方便機制,文件雖然是 UTF-8 編碼,但經過 libc 轉換後,是呈現我們的 Big5 編碼的。但需注意的是,如果原文件就是 Big5 編碼,那存檔時要記得 :set fileencoding=utf8 後再存檔,而且要確定您的系統是否支援 zh_TW.UTF-8 的 locale。
請注意,xterm 要在 zh_TW.Big5 的環境下先啟動,再轉成 zh_TW.UTF-8,否則 xcin 不經這樣「活化」的話,到時會叫不出來,因為,目前的 xcin 尚無法在 UTF-8 locale 環境下啟動。當然,像 yudit 則是由內部自行處理,也自帶輸入法,這時就和外在的 locale 沒有關係了。
http://www.cl.cam.ac.uk/~mgk25/unicode.html
http://www.debian.org/doc/manuals/intro-i18n/
http://xcin.linux.org.tw/i18n/index.html
http://www.unicode.org
info libc(Locales 及 Message Translation 這兩個章節)
telnet bbs.sayya.org 裡頭的 i18n_m17n 版
Compiled by Edward G.J. Lee (2004-02-14)