章 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. Fcitx 支援的輸入法
8.2.5. 一個日語的例子
8.3. 顯示輸出
8.3.1. 終端調配
8.3.2. 東亞環境下寬度有歧義的字元

一個應用軟體的 多語言化 (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 語言環境。

鍵盤系統能夠在系統的不同層級配置。

輸入方式框架(IM)組成:

  • 輸入方式引擎(IME):實際的輸入方式

  • 配置:處理 IBus 和其它服務的配置,比如 IME 外掛的配置

  • 面板:使用者介面,比如語言欄和候選表

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

Keyboard        UI panel    Configuration          Application
|                  ^ |           |                        ^  ^
v                  | v           v                        |  |
Linux kernel -> Input method engine (IME) -+-> Gtk, Qt ---+  |
                   | ^                     |                 |
                   | |                     +-> X11, Wayland -+
                   v |
                IME plugin (ibus-mozc, ...)

不像 X 視窗協議,Wayland 核心協議甚至不支援重音字元輸入。流行的 Wayland 合成器,比如 GNOME 的 Mutter 或 KDE 的 KWin,實現了用於文本輸入的 text-input-unstable-v3 擴充套件協議(參見 當前 Wayland 協議和它們支援的狀態)。

text-input-unstable-v3 協議和 Wayland 輸入法一起工作得很好(參見 Wayland 輸入法專案post-mortem)。

  • 大部分使用 GTK 或 Qt 圖形庫構建的GUI(圖形使用者介面)應用程式支援這個 text-input-unstable-v3

  • 流行的輸入法引擎 Input Method Engines (IME),比如 IBusFcitx (版本 5),能夠和這個 text-input-unstable-v3 一起工作。

  • 輸入法引擎(IME)使用外掛來支援多種語言的文本輸入。

  • 最近的輸入法引擎集成了 "X Keyboard Extension (XKB)",功能和 setxkbmap 類似,之前是由 X 視窗提供在歐洲語言中輸入重音字元支援。

我發現在英語環境("en_US.UTF-8")下啟動日文輸入法非常有用. 下面是使用 IBus 的做法:

  1. 安裝日文輸入法軟體包 ibus-mozc(或 ibus-anthy )。

    • 通用:執行 ibus-setup(1) → 選擇 "Input Method" → 單擊 "Add" → "Japanese" → "Mozc (or Anthy)" → 單擊 "Add"

    • GNOME: 選擇 "Settings" → "Keyboard" → "Input Sources" → 在"Input Sources"中單擊 "+" → "Japanese" → "Mozc (或 Anthy)", 然後單擊"Add"。

  2. 你可以選擇許多輸入源。

  3. 重新登入使用者帳號。

  4. 右鍵單擊 GUI 工具條圖示,設定每一個輸入源。

  5. 使用SUPER-SPACE在安裝的輸入法之間進行切換. (SUPER鍵通常是Windows鍵.)

[提示] 提示

如果你希望在日本物理鍵盤(shift-2 按鍵刻有有一個" 雙引號標記 )上訪問只有字母表的鍵盤環境,在上面的過程中選擇 "Japanese" 。你能夠在物理的“US”鍵盤(shift-2 按鍵刻有有一個 @ 標記)上使用"Japanese mozc (或 anthy)"輸入日文。

  • 對於 Wayland:

    • im-config 軟體包沒有做任何事情,能夠被安全的移除。

    • 你也許不需要設定環境變數,除非為了向後相容性等原因。

    • 如果你需要設定環境變數,建立一個類似 "~/.config/environment.d/50-input-method.conf " 的檔案來設定它們。

  • 對於 X Windows:

    • 安裝 im-config 軟體包。

    • im-config(8) 的使用者介面選單入口是 "Input method"。

    • 此外,從使用者的 shell 來執行 "im-config" 。

    • im-config(8)如果指令是從root帳號執行的表現會有所不同。

    • im-config(8) 讓最佳的輸入法作為系統預設而不需要使用者干預。

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

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

Debian 系統可以使用 console-setup 軟體包配置多個國際化控制台佈局。

# dpkg-reconfigure console-setup

對於 Linux 控制台和 X 視窗系統,這將更新在"/etc/default/console-setup" 裡的配置引數來顯示許多非 ASCII 字元,包括許多歐洲語言使用的重音字元,都能夠使其存在。

有幾個元件可以用來調配字元控制檯和 ncurses(3) 系統功能。

如果 xtermterminfo 對非 Debian 的 xterm 不起作用,則當你從遠端登入到 Debian 系統時,你需要改變你的終端型別 “$TERM”,從 “xterm” 更改為功能受限的版本(例如 “xterm-r6”)。更多內容參見 “/usr/share/doc/libncurses5/FAQ”。“dumb” 是 “$TERM” 中最通用的。

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

您可以繞過這個問題:

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

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