章 8. I18N 和 L10N

內容目錄

8.1. 語言環境
8.1.1. UTF-8 語言環境的基本原理
8.1.2. 語言環境的重新調配
8.1.3. 檔名編碼
8.1.4. 本地化資訊和翻譯文件
8.1.5. 語言環境的影響
8.2. 鍵盤輸入
8.2.1. Linux 控制檯和 X 視窗的鍵盤輸入
8.2.2. Wayland 鍵盤輸入
8.2.3. IBus 支援的輸入法
8.2.4. 一個日語的例子
8.3. 顯示輸出
8.4. 東亞環境下寬度有歧義的字元

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

[提示] 提示

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

程式支援國際化的行為,是透過配置環境變數 "$LANG"來支援本地化。語言環境的實際支援,依賴 libc 庫提供的特性,並要求安裝 localeslocales-all 軟體包。 locales 軟體包需要被適當的初始化。

如果 localeslocales-all 軟體包均沒有安裝,支援語言環境的特性丟失,系統使用 US 英語訊息,並按 ASCII 處理資料。這個行為和 "$LANG" 被設定為 "LANG="、"LANG=C" 或 "LANG=POSIX" 相同。

GNOME 和 KDE 等現代軟體是多語言的。他們透過處理 UTF-8 資料來實現國際化,並透過 gettext(1) 架構提供翻譯資訊來本地化。翻譯資訊可以由獨立的本地化軟體包來提供。

目前的 Debian 桌面 GUI(圖形使用者介面)系統通常在 GUI 環境中設定語言環境為 "LANG=xx_YY.UTF-8"。這裡,"xx" 是 ISO 639 語言程式碼 ,"YY" 是 ISO 3166 國家地區程式碼。這些值由配置桌面的 GUI 對話方塊來設定,並改變程式的行為。參見 節 1.5.2, ““$LANG”變量”

最簡單的文字資料表達是 ASCII,它對英語是足夠的,少於 127 個字元(使用 7 位描述)。

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

“double quoted text” is not "double quoted ASCII"
‘single quoted text’ is not 'single quoted ASCII'

為了支援更多字元,許多字符集和編碼系統被用來支援多語言。(參見 表格 11.2, “編碼值和用法的列表”)。

Unicode 字符集可以用 21 位碼點範圍來顯示幾乎所有人類已知的字元(例如,十六進位制的 0 到 10FFFF)。

文字編碼系統 UTF-8 將 Unicode 碼點適配到一個合理的 8 位資料流,並大部分相容 ASCII 資料處理系統。這個使 UTF-8 作為現代推薦的選擇。UTF 表示 Unicode 轉換格式(Unicode Transformation Format)。當 ASCII 純文字資料轉換為 UTF-8 資料,它有和原始 ASCII 完全一樣的內容和大小。所以配置 UTF-8 語言環境不會有任何丟失。

UTF-8 語言環境下相容的應用程式,你可以顯示和編輯外語文字資料,在所要求的字型和輸入法安裝和啟用後。例如在"LANG=fr_FR.UTF-8"語言環境下,gedit(1) (GNOME 桌面的文字編輯器) 能夠顯示和編輯中文字元文字資料,而顯示的選單是法語。

[提示] 提示

新標準的 "en_US.UTF-8"和老標準的"C"/"POSIX"語言環境都使用標準的 US 英文訊息,它們在排序等方面有細微的不同。在維護老的"C"本地行為時,如果你不僅想處理 ASCII 字元,同時還想優雅的處理 UTF-8 編碼的字元,在 Debian 上使用非標準的 "C.UTF-8"語言環境。

[注意] 注意

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

為了讓系統訪問某一語言環境,語言環境資料必須從語言環境資料庫中編譯。

locales 軟體包 沒有 包含預先編譯的語言環境資料。你需要按下面的方法配置:

# dpkg-reconfigure locales

該過程包含 2 個步驟。

設定在 "/etc/default/locale" 裡的系統範圍的預設語言環境,可以被 GUI(圖形使用者介面)應用程式的 GUI 配置覆蓋。

[注意] 注意

所使用的確切傳統編碼系統可以透過 “/usr/share/i18n/SUPPORTED” 來確認。因此, "LANG=en_US" 是 "LANG=en_US.ISO-8859-1"。

locales-all 軟體包有所有預編譯的語言環境資料,但是不建立"/etc/default/locale",你可能還需要安裝 locales 軟體包。

[提示] 提示

一些 Debian 系發行版的 locales 軟體包,包含有所有語言環境的預先編譯好的語言環境資料。為了模擬這樣的系統環境,你需要同時在 Debian 安裝 localeslocales-all 軟體包。

對於跨平臺的資料交換(參見 節 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

透過 $LANGUAGE 環境變數,GNU gettext 能夠適應翻譯語言的優先順序列表。例如:

 $ export LANGUAGE="pt:pt_BR:es:it:fr"

獲取更多資訊,參見 info gettext ,閱讀 "The LANGUAGE variable" 章節。

sort(1) 和 ls(1)的字元排序受語言環境 locale 影響。匯出 LANG=en_US.UTF-8,排序用字典 A->a->B->b...->Z->z 順序,而匯出 LANG=C.UTF-8,排序使用 ASCII 二進位制 A->B->...->Z->a->b... 順序。

ls(1) 的日期格式受語言環境影響(參見 節 9.3.4, “定製時間和日期的顯示”)。

date(1)程式的日期格式受語言環境的影響。例如:

 $ unset LC_ALL
 $ LANG=en_US.UTF-8 date
Thu Dec 24 08:30:00 PM JST 2023
 $ LANG=en_GB.UTF-8 date
Thu 24 Dec 20:30:10 JST 2023
 $ LANG=es_ES.UTF-8 date
jue 24 dic 2023 20:30:20 JST
 $ LC_TIME=en_DK.UTF-8 date
2023-12-24T20:30:30 JST

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

"$LANG" 環境變數的每一個細節特徵能夠透過設定 "$LC_*" 變數來覆蓋。這些環境變數又能夠透過設定 “$LC_ALL”變數而被再次覆蓋。細節參見 locale(7) man 手冊頁。除非你有強烈的理由建立複雜的配置,請遠離他們並只使用 "$LANG" 變數來設定一個 UTF-8 語言環境。

Wayland 桌面系統上的 GNOME, 節 8.2.1, “Linux 控制檯和 X 視窗的鍵盤輸入” 不支援非英語的歐洲語言。IBus 不僅支援亞洲語言,也支援歐洲語言。GNOME 桌面環境的軟體包依賴關係透過"gnome-shell"推薦"ibus" 。"ibus" 的程式碼已經更新整合 setxkbmap 和 XKB 選項功能。對多語言鍵盤輸入,你需要從 "GNOME Settings" 或 "GNOME Tweaks" 配置 ibus

[注意] 注意

如果 ibus 啟用,即使在基於傳統的 X 的桌面環境下,透過 setxkbmap 配置的傳統的 X 鍵盤,也會被 ibus 覆蓋。你能夠停用安裝的 ibus,使用 im-config 設定輸入法為"None"。更多資訊,參見 Debian 維基:鍵盤

因 GNOME 桌面環境透過"gnome-shell" 推薦"ibus","ibus"對於輸入法來說,是一個好的選擇。

輸入多種語言到應用程式的處理流程如下:

Keyboard                                       Application
   |                                                 ^
   |                                                 |
   +-> Linux kernel ->  Input method (ibus)  -> Gtk, Qt, X, Wayland
                          +-- Engine--+

下面是 IBus 和它的引擎軟體包列表。


[注意] 注意

對於中文,"fcitx5" 可以是一個替代的輸入法框架。對於 Emacs 的狂熱愛好者,"uim"可以是一個替代。無論哪種方式,你可能需要用 im-config 做一些額外的手工配置。像 "kinput2"這類老的 輸入法 任然在 Debian 倉庫中存在,但是不推薦用到現代環境中。

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

只要需要的字型安裝並被啟用,GUI(圖形使用者介面)環境(章 7, GUI(圖形使用者介面)系統)能夠顯示任意 UTF-8 字元。(原始字型資料的編碼會被處理,並對使用者來說是透明的。)

在東亞語言環境下,方框繪製、希臘字元和西里爾字元可能會顯示得比你預期的樣子更寬,這樣會導致終端輸出排列不再整齊(參見 Unicode 標準附錄 #11)。

您可以繞過這個問題:

  • gnome-terminal:首選項 → 配置檔案 → 配置名 → 相容性 → 寬度有歧義的字元 → 窄

  • ncurses:設定環境變數 export NCURSES_NO_UTF8_ACS=0