第 8 章 I18N 和 L10N

目录

8.1. 鍵盤輸入
8.1.1. IBus 支援的輸入法
8.1.2. 一個日語的例子
8.1.3. 禁用輸入法
8.2. 顯示輸出
8.3. East Asian Ambiguous Character Width Characters
8.4. 語言環境
8.4.1. 編碼的基礎知識
8.4.2. UTF-8 語言環境的基本原理
8.4.3. 語言環境的重新配置
8.4.4. “$LANG” 環境變數的值
8.4.5. 只用於 X 視窗的特定語言環境
8.4.6. 檔名編碼
8.4.7. 本地化資訊和翻譯文件
8.4.8. 語言環境的影響

一個應用軟體的 多語言化 (M17N)或本地語言支援,通過 2 個步驟完成。

[提示] 提示

在 multilingualization(多語言化)、internationalization(國際化)和 localization(本地化)中,有17, 18, 或 10 個字母在"m" 和 "n", "i" 和 "n", 或 "l" 和 "n"中間,它們相應表示為 M17N, I18N 和 L10N.

GNOME 和 KDE 等現代軟體是多語言的。他們通過處理 UTF-8 資料來實現國際化,並通過 gettext(1) 架構提供翻譯資訊來本地化。翻譯資訊可以由獨立的本地化軟體包來提供。翻譯資訊易於選擇使用,通過給相關的環境變數設定適當的語言環境即可。

最簡單的文字資料表示方法是 ASCII,使用少於 127 個字元 (用 7 位表示),這對英語足夠了。為了支援用於國際化的更多字元,人們發明了許多字元編碼系統。現代知名的編碼系統是 UTF-8,它可以處理人類所知的幾乎所有字元(參見 第 8.4.1 节 “編碼的基礎知識”).

細節請參見 i18n 介紹.

有本地化硬體配置資料便能支援國際化硬體。

[警告] 警告

本章是基於 2013 年發佈的 Debian 7.0 (Wheezy) 編寫的,所以其內容正在變得過時。

Debian 系統可以使用 keyboard-configurationconsole-setup 軟體包配置多個國際化鍵盤佈局。

# dpkg-reconfigure keyboard-configuration
# dpkg-reconfigure console-setup

這將配置 Linux 控制檯和 X 視窗的鍵盤,並更新 “/etc/default/keyboard” 和 “/etc/default/console-setup” 中的配置引數。這也可以用來配置 Linux 控制檯的字型。

許多非 ASCII 字元,包括許多歐洲語言使用的重音字元,可以使用 死鍵AltGr 鍵組合鍵 來輸入它們。

對於亞洲語言,你需要更復雜的輸入法支援,例如下面將要討論的 IBus

Linux 控制檯只能顯示有限的字元。(你需要使用特殊的終端程式,例如jfbterm(1),從而在非 X 控制檯中顯示非歐洲語言。)

只要需要的字型檔資料存在X視窗可以通過UTF-8編碼顯示任意字元。(X視窗系統能夠維護好原始字型資料編碼,這對使用者來說是透明的)

Under the East Asian locale, the box drawing, Greek, and Cyrillic characters may be displayed wider than your desired width to cause the unaligned terminal output (see Unicode Standard Annex #11).

You can work around this problem:

  • gnome-terminal: Edit → Preferences → Profiles → Edit → Compatibility → Ambiguous-wide characters → Narrow

  • ncurses: Set environment export NCURSES_NO_UTF8_ACS=0.

下面重點介紹在從 gdm3(1) 啟動的 X 視窗環境下執行的應用程式的語言設定。

環境變數 “LANG=xx_YY.ZZZZ” 將語言環境設定為語言程式碼 “xx”、國家程式碼 “YY” 和編碼 “ZZZZ”(參見 第 1.5.2 节 ““$LANG”變量”)。

現在的 Debian 系統一般將語言環境設定為 “LANG=xx_YY.UTF-8”。這將會使用帶有 Unicode 字符集的 UTF-8 編碼。UTF-8 編碼系統是多位元組的程式碼系統並且碼點的使用更加智慧。ASCII 資料(只包含了7位二進位制程式碼)總是合法的 UTF-8 資料(每個字元使用1個位元組)。

之前的 Debian 系統曾經將語言環境設定為 “LANG=C” 或 “LANG=xx_YY”(沒有 “.UTF-8”)。

  • LANG=C” 或 “LANG=POSIX” 使用 ASCII 字符集。

  • LANG=xx_YY” 使用 Unix 的傳統編碼系統。

LANG=xx_YY” 所使用的確切傳統編碼系統可以通過 “/usr/share/i18n/SUPPORTED” 來確認。例如,“en_US” 使用 “ISO-8859-1” 編碼,“fr_FR@euro” 使用 “ISO-8859-15” 編碼。

[提示] 提示

編碼值的含義,參見 表 11.2 “編碼值和用法的列表”

Unicode 字符集可以用從 0 到 10FFFF (十六進位制)範圍的碼點來顯示幾乎所有人類已知的字元。它的儲存至少需要 21 位。

文字編碼系統 UTF-8 將 Unicode 碼點適配到一個合理的 8 位資料流,併兼容 ASCII 資料處理系統。UTF 表示 Unicode 轉換格式(Unicode Transformation Format)。

我建議在你的桌面使用 UTF-8 語言環境,例如 “LANG=zh_CN.UTF-8”。語言環境的第一部分決定了應用程式中顯示的資訊。例如,“LANG=fr_FR.UTF-8” 語言環境下的 gedit(1)(GNOME 桌面的文字編輯器),選單是用法語顯示的,但只要安裝所需的字型和輸入法就可以顯示和編輯中文字元文字資料。

我還建議只使用 “$LANG” 環境變數來設定語言環境。我沒有看到在 UTF-8 語言環境下設定複雜的 “LC_*” 變數組合有什麼好處(參見 locale(1))。

即使純英文文字也可能包含非 ASCII 字元,例如微微卷曲的左右引號在 ASCII 中是不可用的。

“雙引號的文字” 並非 “雙引號的 ASCII”
‘單引號的文字’ 並非 ‘單引號的 ASCII’

當純 ASCII 文字資料轉換為 UTF-8 後,它會具有與原本完全相同的內容和大小。因此使用 UTF-8 語言環境並不會使你損失什麼。

一些程式在支援 I8N 後會消耗更多的記憶體。這是因為它們為了速度優化,而在內部使用 UTF-32(UCS4) 來支援 Unicode,並且每個獨立於語言環境所選的 ASCII 字元資料都會消耗 4 個位元組。再一次地,使用 UTF-8 語言環境並不會使你損失什麼。

供應商指定的舊的非 UTF-8 編碼系統在一些字元上往往有較小但惱人的不同,例如許多國家使用的字形。而使用了 UTF-8 系統的現代作業系統基本上能解決這行編碼衝突問題。

你可以像下面那樣選擇只用於 X 視窗的特定語言環境,而不管你的系統使用 PAM 定製(參見 第 4.5 节 “PAM 和 NSS”)的預設語言環境。

這個環境能夠給你提供最好的桌面體驗,並保持穩定。即使 X 視窗系統不工作,你也可以訪問帶有可讀資訊的多功能字元終端。這對於使用非羅馬字元(如中文,日語和韓語)的語言來說是必不可少的。

[注意] 注意

改善 X 會話管理軟體包可能會使另一種可用的方法,但請閱讀下面的內容作為設定語言環境的通用和基礎的方法。對於 gdm3(1),我們知道你能夠通過它的選單來選擇 X 會話的語言環境。

在 PAM 配置檔案中的下面這行定義了語言環境的檔案位置,例如 “/etc/pam.d/gdm3”。

auth    required        pam_env.so read_env=1 envfile=/etc/default/locale

將這行改成下面那樣。

auth    required        pam_env.so read_env=1 envfile=/etc/default/locale-x

對於中文,建立一個帶有 “-rw-r--r-- 1 root root” 許可權的 “/etc/default/locale-x” 檔案,幷包含下面這行。

LANG="zh_CN.UTF-8"

保持用於其它程式的預設 “/etc/default/locale” 檔案有下面這行。

LANG="en_US.UTF-8"

這是定製語言環境最通用的技術,並且會使 gdm3(1) 本身的選單選擇對話方塊被本地化。

對於該情況的另一種解決方法是使用 “~/.xsessionrc” 檔案來改變語言環境。

對於跨平臺的資料交換(參見 第 10.1.7 节 “可移動儲存裝置”),你需要使用特殊的編碼掛載檔案系統.舉個例子,不使用選項時,mount(8) 假設 vfat 檔案系統 使用 CP437. 你需要給檔名提供明確的掛載選項來使用UTF-8CP932.

[注意] 注意

在 GNOME 這類的現代桌面環境下,當自動掛載一個熱拔插 U 盤時,你可以提供這樣的掛載選項。右擊桌面上的圖示,點選 "Drive" , "Setting", 輸入 "utf8" 到 "Mount options:". 當這個 U 盤下次掛載時,UTF-8 就可以了。

[注意] 注意

如果你在升級一個系統,或者從老的非 UTF-8 系統遷移磁碟,非 ASCII 字元的檔名也許是使用老舊的 ISO-8859-1eucJP 來編碼. 請尋求文字轉換工具把他們轉換到 UTF-8. 參見 第 11.1 节 “文字資料轉換工具”.

在預設情況下,Samba 對新的客戶端(Windows NT, 200x, XP)使用 Unicode,但對老的客戶端(DOS 和 Windows 9x/Me)使用 CP850.可以在 "/etc/samba/smb.conf" 檔案裡面,使用"dos charset" 來改變老客戶端的這個預設編碼。比如說,CP932 表示為日語。

在 Debian 系統中顯示的許多文件和文字資訊有翻譯存在,比如錯誤資訊、標準程式輸出、選單和手冊頁。GNU gettext(1) 命令工具鏈是大部分翻譯活動的後端工具。

aptitude(8) 裡,"Tasks" → "Localization" 提供一個有用的二進位制包擴充套件列表, 給應用程式增加本地化資訊和提供翻譯文件。

舉個例子,你可以安裝 manpages-<LANG> 包來獲得本地化 man 手冊頁資訊。從 "/usr/share/man/it/" 來讀取 <programname> 義大利語的 man 手冊頁 ,執行下面的操作。

LANG=it_IT.UTF-8 man <programname>

sort(1) 的字元排序,受 語言環境的影響. 西班牙語和英語語言環境排序是不一樣的。

ls(1) 的日期格式受語言環境影響. "LANG=C ls -l" 和 "LANG=en_US.UTF-8" 的日期格式是不一樣的(參見 第 9.2.5 节 “定製時間和日期的顯示”).

不同語言環境的數字標點不一樣.比如說,英語語言環境中, 一千點一顯示為 "1,000.1",而在德語語言環境中,它顯示為 "1.000,1". 你可以在電子表格程式裡面看到這個不同。