i18n_tool-7
-----------
本套件包含了一個 zh_TW.Big5 與 zh_CN.GB2312 locale data, 以及一個修正過
的 lcGen 模組,可以讓您在 GNU/Linux 系統上建立起所需的 locale 環境。
請注意,本套件所附的 locale data 只適用於 glibc-2.1.X 的版本,其中 X 可
以為 1 或 2 或 3,但 *不適用* 於其他的版本。
同時,本文的說明只適用於 glibc-2.1.X/2.2,以及 XFree86-3.3.5/3.3.6/4.0.X
及以上的版本,對於早期的版本如 glibc-2.0.7 及 XFree86-3.3.4 或更早的皆不
適用。因此,如果您的系統還在用這些早期版本的話,我們強烈建議您將它們更新,
最好是更新到 glibc-2.1.3 與 XFree86-3.3.6 以上。如果您非常堅持一定要用早
期版本的話,則您可以參考 README.old.Big5 的說明,有限度地建立 locale 環境。
因此,在您繼續往下看之前,請先確定您系統軟體的版本。
A. 確定系統軟體的版本:
-----------------------
在這裡您必須確定您的 glibc 與 XFree86 的版本,方式如下:
1. glibc:
ls -l /lib/libc*
如果列出的檔名中,有一個 libc-2.1.3.so,同時 /lib/libc.so.6 這個 symbolic
link 也是指向 libc-2.1.3.so 的話,表示您的系統正使用 glibc-2.1.3 版。其
他的版本同理可知。請注意如果是 libc-2.1.9X.so 的話,則它是正在發展與測試
中的 glibc-2.2 版,它與 glibc-2.1.X 是很不一樣的,必須以 glibc-2.2 版的方
式來處理。
2. XFree86:
xterm -h
這時它會列出一堆 xterm 的使用說明,其中便會包括 XFree86 的版本名。
若您的系統是 glibc-2.1.X 以上,以及 XFree86-3.3.5 以上者,請往下看,否則,
建議您先將這兩個套件更新。
B. 您要安裝那一個 locale?
---------------------------
本套件提供兩種 locale 的安裝方式,以及可以在 glibc-2.1.X 下使用的 locale
data 檔。實際上,不論是安裝那一種 locale, 其方式都一模一樣,因此如果您打
算安裝的 locale 不在本文說明之列時,只要您可以找到所需的 locale data 檔
(包括一個 locale input 檔與其相對應的 charmap 檔,詳見後述),您一樣可以
模仿本文所述的步驟來完成它。
就本文所提及的 locale,計有 zh_TW.Big5 與 zh_CN.GB2312 兩種。其中前者適用
於台灣地區繁體 Big5 字集的環境,而後者則適用於大陸地區簡體 GB2312 字集。
因此,您可以視您的需要挑選其中一種來安裝,或者全部安裝亦可。
C. glibc locale:
-----------------
這裡可分為 glibc-2.1.X 與 glibc-2.2 (包括 glibc-2.1.9X) 兩種情況來說明:
a. glibc-2.1.X:
---------------
1. 請先確定您要安裝的 locale (zh_TW.Big5 或 zh_CN.GB2312) 是否存在於您的
系統中?如果已存在則不必安裝了。確認方式有兩種:
1) 執行 locale -a 指令,看看是否有印出 zh_TW.Big5 或 zh_CN.GB2312?
如果有,表示已有安裝。
2) 在這一版 glibc 中,所有的 locale 資料檔都是裝在 /usr/share/locale
目錄下,請到那裡看看是否找得到 zh_TW.Big5 或 zh_CN.GB2312 的目錄?
同時這兩個目錄下必須分別內含 LC_CTYPE 檔。如果都有,表示已有安裝。
請注意,如果您系統中的 locale 名稱大小寫不一致,例如 zh_TW.big5 或
zh_CN.gb2312,請您將它們的名稱大小寫改成一致即可。方法為改變
/usr/share/locale 底下 locale 目錄名稱,例如:
mv /usr/share/locale/zh_TW.big5 /usr/share/locale/zh_TW.Big5
2. 若在您的系統沒有安裝您需要的 locale 的話 (如 zh_TW.Big5),請到本套件
的 i18n_tool/localedata/zh_TW.Big5/ 目錄下,執行:
localedef -i zh_TW -f BIG5_1984 -u mnemonic.ds zh_TW.Big5
其中 zh_TW 為 locale input 檔,BIG5_1984 為 charmap 檔,這兩個都是本
套件所提供的。至於 mnemonic.ds 稱為 repertoiremaps 檔,必須存在於您的
系統中: /usr/share/i18n/repertoiremaps/ 的目錄下。如果沒有的話,您必
須按照您的 GNU/Linux 系統的套件安裝說明,找到名為 i18n_data 之類的套
件名,將它裝起來,就會有這個檔案了。至於最後的 zh_TW.Big5 則為我們希
望產生的 locale 名稱。
完成後,您的 /usr/share/locale/ 目錄下就會出現 zh_TW.big5 目錄。但
在 CLE 的慣例中,locale 名為 zh_TW.Big5, 在此本文遵照這樣的慣例。
故請將 /usr/share/locale 目錄下的 zh_TW.big5 目錄改名為 zh_TW.Big5。
而對於 zh_CN.GB2312 locale,方式類同,請到本套件的
i18n_tool/localedata/zh_CN.GB2312/ 目籹下,執行:
localedef -i zh_CN -f GB2312 -u mnemonic.ds zh_CN.GB2312
同樣的,zh_CN 為 locale input 檔,GB2312 是 charmap 檔。在完成後,也
請將 /usr/share/locale/ 下的 zh_CN.gb2312 目錄改名為 zh_CN.GB2312。
3. 若您安裝的是 zh_CN.GB2312 locale,請您看一下 /usr/lib/gconv/gconv-modules
的內容,搜尋一下 EUC-CN 這個字眼,您會看到大概在 880 行左右,其內容為:
# from to module cost
alias EUCCN// EUC-CN//
alias GB2312// EUC-CN//
module EUC-CN// INTERNAL EUC-CN 1
module INTERNAL EUC-CN// EUC-CN 1
注意上頭的第三行: "alias GB2312// EUC-CN//", 若您的檔案中沒有這一行,
請自行將它加入。
b. glibc-2.1.9X 與 glibc-2.2:
-----------------------------
glibc-2.1.9X 是尚在發展、測試中的 glibc-2.2 版本。請注意由於這個系列的 I18N
與 locale 環境比起舊版有重大的改變,同時也仍在快速發展中,因此這部分的 locale
安裝設定可能隨時間不同而稍有變化。然而,在此系列中,所有東方語系的 locale 如
zh_TW.Big5 或 zh_CN.GB2312 等都有支援,因此我們不需要再加裝其他額外的檔案或
套件,只需適當的微調 (或甚至完全不需要微調) 即可直接使用。
要注意的是,我們傳統上使用的 locale 名,其在 glibc-2.2 系列的內部名稱已有改
變,例如 zh_TW.Big5 在其內部名稱為 zh_TW,而 zh_CN.GB2312 在其內部名稱為
zh_CN。glibc-2.2 希望做到的是,不論其內部名稱如何,我們在一般使用時仍可使用
我們原有的慣例,也就是 zh_TW.Big5 以及 zh_CN.GB2312。
以下是安裝 / 微調的步驟:
1. 首先,您要先檢查一下您系統中是否已安裝了適當的 locale data?您可以使用這
個指令:
locale -a
看看輸出的結果中有沒有 zh_TW 或 zh_CN?其中 zh_TW 即為 zh_TW.Big5,而
zh_CN 即為 zh_CN.GB2312。如果有的話,則您可以跳過這一個步驟。如果沒有的
話,則您可以用如下的方式產生出來。先看看
/usr/share/i18n/
目錄是否存在?那裡頭應該要有 locales/, charmaps/ 兩個目錄,如果找不到的
話表示您沒有安裝 glibc-2.2 內附的 i18n_data 之類的套件,請將它裝起來。
然後,執行這兩個指令:
localedef -i zh_TW -f BIG5 zh_TW
localedef -i zh_CN -f GB2312 zh_CN
請注意,這裡的 locale input 檔與 charmap 檔必須使用 glibc-2.2 內附的,而
不能用本套件所提供的。而這些檔案就放在 /usr/share/i18n/ 的 locales/ 與
charmaps/ 目錄下,您不需要特別指定路徑,localedef 程式會自動到上述的目錄
裡搜尋。完成之後,在 /usr/lib/locale/ 目錄下就會出現 zh_TW/ 與 zh_CN/ 目
錄了。這就是我們所需的 locale data。
2. 如果您的 glibc 版本是 glibc-2.1.97 以後 (包含 2.1.97) 的話,則到此為止您
系統的 locale 已安裝完成了。若不是的話,我們建議您最好更新 glibc 的版本
到 glibc-2.1.97 以後,如果您不願意的話,則您必須要再做一步微調:
cd /usr/lib/locale; ln -s zh_TW zh_TW.Big5
cd /usr/lib/locale; ln -s zh_CN zh_CN.GB2312
再次聲明,我們強列建議您升級到 glibc-2.1.97 以後,如此您就不需要這一步的
微調,因為這麼做是不自然,而且不符合標準的。
3. 最後,我們建議再做這一步:
cd /usr/share/locale; ln -s zh_TW zh_TW.Big5
cd /usr/share/locale; ln -s zh_CN zh_CN.GB2312
這是因為按照標準,程式的訊息翻譯應該要裝在
/usr/share/locale/zh_TW/LC_MESSAGES/
/usr/share/locale/zh_CN/LC_MESSAGES/
下,而不是 zh_TW.Big5/LC_MESSAGES/ 或 zh_CN/GB2312/LC_MESSAGES/ 下,但現
階段仍有許多應用程式沒有遵照此一標準,故我們建議做這一步讓整個系統環境更
符合標準些。
D. XFree86:
------------
不論是 XFree86-3.3.5/3.3.6 或 XFree86-4.0/4.0.X,以下的說明都適用。
a. zh_TW.Big5 locale:
---------------------
1. 請檢查您的 /usr/X11R6/lib/X11/locale/ 目錄下是否有 zh_TW.Big5/ 目錄,
且該目錄下也有 XLC_LOCALE 檔?若無,則請將本套件的
i18n_tool/localedata/zh_TW.Big5/XLC_LOCALE 檔放到
/usr/X11R6/lib/X11/locale/zh_TW.Big5/
目錄下 (您可能需要自行建此目錄)。
2. 若是您用的是 XFree86-3.3.X,請檢查 /usr/X11R6/lib/X11/locale/locale.dir
檔,看看有沒有底下這一行:
zh_TW.Big5/XLC_LOCALE zh_TW.Big5
如果沒有的話,請自行加入。如果是 XFree86-4.0.X 的系統,則看看是否有底下
這幾行?沒有的話請自行加入:
zh_TW.Big5/XLC_LOCALE: zh_TW.Big5
zh_TW.Big5/XLC_LOCALE: zh_TW.big5
zh_TW.Big5/XLC_LOCALE: zh_TW
請注意這裡每一行的格式與 XFree86-3.3.X 相較稍有不同,都要多一個冒號。
3. 您必須準備適當的中文字型。由第一點的 XLC_LOCALE 的定義,顯示 zh_TW.Big5
locale 中文字型的部分是 BIG5-0, 故您的系統中必須要有這類字型。以我的系統
為例,因為我安裝的是 twmoe 字型 (您可以在
ftp://linux.cis.nctu.edu.tw/packages/chinese 找到它們),其字型名末尾是
big5-1, 故我是將這些字型 alias 成末尾是 big5-0:
$ xlsfonts | grep big5
-twmoe-kai-medium-r-normal--16-160-75-75-c-160-big5-1
-twmoe-kai-medium-r-normal--24-240-75-75-c-240-big5-1
-twmoe-kai-medium-r-normal-fs-16-160-75-75-c-160-big5-0
-twmoe-kai-medium-r-normal-fs-24-240-75-75-c-240-big5-0
$ more /usr/X11R6/lib/X11/fonts/chinese/fonts.alias
-twmoe-kai-medium-r-normal-fs-16-160-75-75-c-160-big5-0 -twmoe-kai-medium-r-normal--16-160-75-75-c-160-big5-1
-twmoe-kai-medium-r-normal-fs-24-240-75-75-c-240-big5-0 -twmoe-kai-medium-r-normal--24-240-75-75-c-240-big5-1
b. zh_CN.GB2312 locale:
-----------------------
1. zh_CN.GB2312 locale 的安裝方式類同。首先對於 XLC_LOCALE 檔您不需要再額外
安裝,因為 XFree86 很早就已內含了,不過它是放在:
/usr/X11R6/lib/X11/locale/zh/
故對於 XFree86-3.3.X 的系統,我們只要修改 locale.dir 檔,加入這一行:
zh/XLC_LOCALE zh_CN.GB2312
即可。至於 XFree86-4.0.X 的系統,我們也是修改同一個檔,但請記得格式稍有
不同,要多個冒號,如下:
zh/XLC_LOCALE: zh_CN.GB2312
2. 您必須安裝 GB 碼的字型,且字型的末尾名必須是 GB2312.1980-0 。您可以試
著在 XFree86 的套件中找找看是否有 GB 字型,或是到各 ftp 站搜尋。
E. 測試您的 locale 環境:
-------------------------
底下我們提供一個小程式,可以用來測試您的 locale 環境是不是正常的。程式的原始
碼如下:
=================================================================
#define USE_XOPEN_SOURCE
#include <stdio.h>
#include <locale.h>
#ifdef USE_XOPEN_SOURCE
# include <langinfo.h>
#endif
#include <X11/Xlib.h>
#include <X11/Xlocale.h>
main()
{
printf("LC_CTYPE = %s\n", setlocale(LC_CTYPE, ""));
#ifdef USE_XOPEN_SOURCE
printf("encoding = %s\n", nl_langinfo(CODESET));
#endif
if (XSupportsLocale() == True)
printf("X Locale = OK\n");
}
=================================================================
您可以將這一段程式碼存成 localetest.c 檔,然後用這個指令來編譯:
gcc localetest.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
如果在編譯過程中有任何錯誤的話,請將
#define USE_XOPEN_SOURCE
這一行刪除,然後再重新編譯一次。完成後,就會產生一個名為 a.out 的檔案,接著
您就可以做如下的測試:
LC_ALL=zh_TW.Big5 ./a.out
如果印出如下的結果:
LC_CTYPE = zh_TW.Big5
encoding = BIG5
X Locale = OK
表示您的 locale 已安裝成功了 (請注意,如果您將 #define USE_XOPEN_SOURCE 拿
掉後再編譯的話,則不會有 encoding = .... 那一行)。同理,對於 zh_CN.GB2312
測試結果應如下:
指令: LC_ALL=zh_CN.GB2312 ./a.out
LC_CTYPE = zh_CN.GB2312
encoding = GB2312
X Locale = OK
請注意,如果您的系統中原本已有 zh_CN.GB2312 locale,但其測試結果為:
LC_CTYPE = zh_CN.GB2312
encoding = GB2312-1980
X Locale = OK
則我們建議您重新安裝一次 zh_CN.GB2312 locale,請參考第 C 節的說明。
F. 啟動 I18N 程式 --- 設定 locale:
-----------------------------------
如果您系統的 I18N 與 locale 環境已安裝完成了,則當您要要啟動任何 I18N 程
式時,首先要設好 locale,方式如下 (以下以 zh_TW.Big5 locale 為例,zh_CN.GB2312
方式一樣):
設定環境變數: 您可以設定三種環境變數 (這裡以 bash 為例):
(1) export LANG=zh_TW.Big5
(2) export LC_CTYPE=zh_TW.Big5
(3) export LC_ALL=zh_TW.Big5
其中 LANG 是設定整個系統環境使其成為 zh_TW.Big5 locale,而 LC_CTYPE 是設定
文字處理類別為 zh_TW.Big5 locale,而 LC_ALL 是設定所有的環境類別為 zh_TW.Big5
locale。您可以選擇其中一個來設定,但要注意這三種方式在系統的優先序是
(1) < (2) < (3)
換句話說,如果同時設定 (1) 與 (2) 且二者的設定值不一樣時,系統會以 (2) 的設
定為準。同理如果有設定 (3) 時,系統就以 (3) 的設定為準。您可以用 locale 指
令看看目前的設定如何,例如:
$ locale
LANG=POSIX
LC_CTYPE=zh_TW.Big5
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_ALL=
在此我們可以見到 locale 環境中,除了 LC_CTYPE 類別是設為 zh_TW.Big5 以外,其
餘類別都是預設值,即 "POSIX"。有關各類別的詳細意義,請見 man 3 setlocale。
無論如何,當我們要啟動 I18N 的程式時,至少 LC_CTYPE 類別一定要設成我們要用的
locale。如果我們進一步希望程式的訊息輸出是也是中文時,則可以將 LC_MESSAGES
類別也設成 zh_TW.Big5:
export LC_MESSAGES=zh_TW.Big5
完成 locale 設定之後,就可以啟動 I18N 程式了。
作者: 謝東翰 (Tung-Han Hsieh)
Email: thhsieh@linux.org.tw