第 8 章 国际化和本地化

# 第 8 章 国际化和本地化

一个应用软件的 多语言化 (M17N)或本地语言支持，通过 2 个步骤完成。

- 国际化 (I18N): 使一个软件能够处理多个语言环境。

- 本地化 (L10N)：使一个软件处理一个特定的语言环境。

| 提示
在 multilingualization（多语言化）、internationalization（国际化）和 localization（本地化）中，有17, 18, 或 10 个字母在"m" 和 "n", "i" 和 "n", 或 "l" 和 "n"中间，它们相应表示为 M17N, I18N 和 L10N。细节参见 国际化和本地化 。

## 8.1. 语言环境

程序支持国际化的行为，是通过配置环境变量 "`$LANG`"来支持本地化。语言环境的实际支持，依赖 `libc` 库提供的特性，并要求安装 `locales` 或 `locales-all` 软件包。 `locales` 软件包需要被适当的初始化。

如果 `locales` 或 `locales-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`”变量”

### 8.1.1. UTF-8 语言环境的基本原理

最简单的文本数据表达是 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 语言环境并不会使你损失什么。

### 8.1.2. 语言环境的重新配置

为了让系统访问某一语言环境，语言环境数据必须从语言环境数据库中编译。

`locales` 软件包 没有 包含预先编译的语言环境数据。你需要按下面的方法配置：

    # dpkg-reconfigure locales

该过程包含 2 个步骤。

1. 选择所有需要的语言环境数据编译为二进制形式。（请确认至少包含一个 UTF-8 语言环境 ）

2. 通过创建 “`/etc/default/locale`” 来设置系统默认的语言环境值给 PAM 使用（参见 第 4.5 节 “PAM 和 NSS”）。

设置在 "`/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 安装 `locales` 和 `locales-all` 软件包。

### 8.1.3. 文件名编码

对于跨平台的数据交换(参见 第 10.1.7 节 “可移动存储设备”),你需要使用特殊的编码挂载文件系统.举个例子，不使用选项时，mount(8) 假设 vfat 文件系统 使用 CP437. 你需要给文件名提供明确的挂载选项来使用UTF-8 或 CP932.

| 注意
在 GNOME 这类的现代桌面环境下，当自动挂载一个热拔插 U 盘时，你可以提供这样的挂载选项。右击桌面上的图标，点击 "Drive" , "Setting", 输入 "utf8" 到 "Mount options:". 当这个 U 盘下次挂载时，UTF-8 就可以了。

| 注意
如果你在升级一个系统，或者从老的非 UTF-8 系统迁移磁盘，非 ASCII 字符的文件名也许是使用老旧的 ISO-8859-1 或 eucJP 来编码. 请寻求文本转换工具把他们转换到 UTF-8. 参见 第 11.1 节 “文本数据转换工具”.

在默认情况下，Samba 对新的客户端(Windows NT, 200x, XP)使用 Unicode，但对老的客户端(DOS 和 Windows 9x/Me)使用 CP850.可以在 "`/etc/samba/smb.conf`" 文件里面，使用"`dos charset`" 来改变老客户端的这个默认编码。比如说，CP932 表示为日语。

### 8.1.4. 本地化信息和翻译文档

在 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" 章节。

### 8.1.5. 语言环境的影响

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 语言环境。

## 8.2. 键盘输入

The keyboard system can be configured at different layers of the system.

- Linux 内核: keyboard(5)

- X server: setxkbmap(1), xkeyboard-config(5), environment variable `XMODIFIERS`

- GUI desktop environment: Input Method framework: `ibus`, `fcitx5`

- Application: environment variables to set its input source: `GTK_IM_MODULE`, `QT_IM_MODULE`, `QT_IM_MODULES`, ...

Input method framework (IM) consists of:

- Input method engine (IME): Actual input method

- Configuration: Handles the configuration for IBus and other services such as IME plugins

- Panel: User interface such as language bar and candidate selection table

输入多种语言到应用程序的处理流程大致如下：

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

### 8.2.1. Linux 控制台和 X 窗口的键盘输入

Debian 系统可以使用 `keyboard-configuration` 软件包配置多个国际化键盘布局。

    # dpkg-reconfigure keyboard-configuration

对于 Linux 控制台和 X 窗口系统，这将更新在 "`/etc/default/keyboard`"里的配置参数。许多非 ASCII 字符，包括许多欧洲语言使用的重音字符，可以使用 死键、AltGr 键 和 组合键 来输入它们。

| 注意
如果 ibus 激活，即使在基于传统的 X 的桌面环境下，通过 `setxkbmap` 配置的传统的 X 键盘，也会被 `ibus` 覆盖。你能够禁用安装的 `ibus`，使用 `im-config` 设置输入法为"None"。更多信息，参见 Debian 维基：键盘。

### 8.2.2. Wayland 键盘输入

Unlike the X Window protocol, the Wayland core protocol doesn't even support the input of accented characters. Popular Wayland Compositors, such as Mutter for GNOME or KWin for KDE, implement extension protocols such as the `text-input-unstable-v3` for the text input (see "current Wayland protocols and their support status").

The `text-input-unstable-v3` protocol works well with Input methods for Wayland (see "Wayland input method project post-mortem").

- Most GUI applications are built with GUI libraries such as GTK or Qt which support this `text-input-unstable-v3`.

- Popular Input Method Engines (IME), such as IBus or Fcitx (version 5), can work with this `text-input-unstable-v3`.

- IMEs support text input for many languages with plugins.

- Recent IMEs integrate "X Keyboard Extension (XKB)" functionalities such as `setxkbmap` previously provided by the X Window to support accented character text input for European languages for Wayland.

### 8.2.3. IBus 支持的输入法

For GNOME, "`ibus`" is the default IME which is automatically installed via its package dependency.

- Most multilingualized keyboard input features can be configured from "GNOME Settings" or "GNOME Tweaks".

- Some multilingualized keyboard input features may need to be configured from the ibus-setup(1) command.

- The emoji keyboard input is available by typing "`SUPER-.`" (Simultaneously type Windows and period keys) followed by a keyword for each emoji and SPACE-keys.

下面是 IBus 和它的插件软件包列表。

表 8.1. IBus 和它的插件软件包列表

软件包 | 流行度 | 大小 | 支持的语言环境
--- | --- | --- | ---
ibus | V:210, I:250 | 1828 | 使用 dbus 的输入方式框架
ibus-mozc | V:2.2, I:3.9 | 979 | 日文
ibus-anthy | V:0.5, I:1.2 | 8958 | 日文
ibus-skk | V:0.05, I:0.16 | 242 | 日文
ibus-kkc | V:0.04, I:0.17 | 206 | 日文
ibus-libpinyin | V:1.1, I:5.1 | 123 | 中文（zh_CN）
ibus-chewing | V:0.16, I:0.84 | 298 | 繁体中文（zh_TW）
ibus-libzhuyin | V:0.00, I:0.12 | 41021 | 繁体中文（zh_TW）
ibus-rime | V:0.26, I:0.49 | 76 | 中文(zh_CN/zh_TW)
ibus-cangjie | V:0.01, I:0.11 | 235 | 中文（zh_HK）
ibus-hangul | V:0.3, I:2.0 | 261 | 韩文
ibus-libthai | V:0.00, I:0.04 | 84 | 泰文
ibus-table-thai | I:0.05 | 59 | 泰文
ibus-unikey | V:0.18, I:0.38 | 286 | 越南语
keyman | V:0.00, I:0.12 | 507 | 多语言：Keyman 插件，超过 2000 种语言
ibus-table | V:0.1, I:1.0 | 2364 | IBus 表插件
ibus-m17n | V:0.2, I:1.9 | 373 | 多语言：印度语、阿拉伯语和其它

### 8.2.4. Fcitx 支持的输入法

Fcitx（版本号5）输入法框架在中国广受欢迎并与"`ibus`"兼容。

下面是"`fcitx5`"和它的插件软件包列表。

表 8.2. Fcitx5 和它的插件软件包列表

软件包 | 流行度 | 大小 | 支持的语言环境
--- | --- | --- | ---
fcitx5 | V:8, I:12 | 761 | 输入方式框架和"`ibus`"兼容
fcitx5-mozc | V:1.1, I:1.8 | 1265 | 日文
fcitx5-anthy | V:0.07, I:0.21 | 808 | 日文
fcitx5-skk | V:0.06, I:0.17 | 369 | 日文
fcitx5-kkc | V:0.01, I:0.07 | 416 | 日文
fcitx5-chinese-addons | I:9.0 | 17 | 中文（zh_* 的元软件包）
fcitx5-pinyin | V:3.9, I:9.4 | 996 | 中文（zh_CN）
fcitx5-chewing | V:0.24, I:0.93 | 217 | 繁体中文（zh_TW）
fcitx5-zhuyin | I:0.07 | 41051 | 繁体中文（zh_TW）
fcitx5-rime | V:0.45, I:0.90 | 371 | 中文(zh_CN/zh_TW)
fcitx5-table-cangjie-large | I:0.12 | 1292 | 中文（zh_HK）
fcitx5-hangul | V:0.11, I:0.25 | 235 | 韩文
fcitx5-libthai | I:0.04 | 119 | 泰文
fcitx5-table-thai | I:0.07 | 34 | 泰文
fcitx5-unikey | V:0.09, I:0.20 | 588 | 越南语
fcitx5-m17n | V:0.16, I:0.58 | 259 | 多语言：印度语、阿拉伯语和其它
fcitx5-table | V:0.3, I:9.3 | 417 | fcitx5 表插件
fcitx5-keyman | V:0.04, I:0.05 | 235 | 多语言：Keyman 插件，超过 2000 种语言

### 8.2.5. 一个日语的例子

我发现在英语环境("`en_US.UTF-8`")下启动日文输入法非常有用. 下面是使用 IBus 的做法:

1. 安装日文输入法软件包 `ibus-mozc`（或 `ibus-anthy` ）。

2. - Generic: Execute ibus-setup(1) → select "Input Method" → click "`Add`" → "Japanese" → "Mozc (or Anthy)" → click "Add"

   - GNOME: 选择 "Settings" → "Keyboard" → "Input Sources" → 在"Input Sources"中单击 "`+`" → "Japanese" → "Mozc (或 Anthy)"， 然后单击"Add"。

3. 你可以选择许多输入源。

4. 重新登录用户账户。

5. 右键单击 GUI 工具条图标，设置每一个输入源。

6. 使用 SUPER-SPACE 在安装的输入法之间进行切换. (SUPER 键通常是 Windows 键.)

| 提示
如果你希望在日本物理键盘（shift-`2` 按键刻有有一个`"` 双引号标记 ）上访问只有字母表的键盘环境，在上面的过程中选择 "Japanese" 。你能够在物理的“US”键盘（shift-`2` 按键刻有有一个 `@` 标记）上使用"Japanese mozc (或 anthy)"输入日文。

- 对于 Wayland：

  - The `im-config` package does nothing and can be removed safely.

  - You probably don't need to set environment variables except for the backward compatibility etc.

  - If you need to set environment variables, create a file such as "`~/.config/environment.d/50-input-method.conf` "to set them.

- 对于 X Windows：

  - 安装 `im-config` 软件包。

  - im-config(8) 的用户界面菜单入口是 "Input method"。

  - 此外，从用户的 shell 来执行 "`im-config`" 。

  - 如果命令从 root 账户或 非 root 账号执行，im-config(8) 表现会有所不同。

  - im-config(8) 让最佳的输入法作为系统默认而不需要用户干预。

## 8.3. 显示输出

Linux 控制台只能显示有限的字符。（你需要使用特殊的终端程序，例如 jfbterm(1)，从而在非 GUI 控制台中显示非欧洲语言。）

只要需要的字体安装并被启用，GUI（图形用户界面）环境（第 7 章 GUI（图形用户界面）系统）能够显示任意 UTF-8 字符。（原始字体数据的编码会被处理，并对用户来说是透明的。）

### 8.3.1. 终端配置

Debian 系统可以使用 `console-setup` 软件包配置多个国际化控制台布局。

    # dpkg-reconfigure console-setup

For the Linux console and the X Window system, this updates configuration parameters in "`/etc/default/console-setup`" to display many non-ASCII characters including accented characters used by many European languages can be made available.

有几个组件可以用来配置字符控制台和 ncurses(3) 系统功能。

- “`/etc/terminfo/*/*`” 文件（terminfo(5)）

- “`$TERM`” 环境变量（term(7)）

- setterm(1)、stty(1)、tic(1) 和 toe(1)

如果 `xterm` 的 `terminfo` 对非 Debian 的 `xterm` 不起作用，则当你从远程登录到 Debian 系统时，你需要改变你的终端类型 “`$TERM`”，从 “`xterm`” 更改为功能受限的版本（例如 “`xterm-r6`”）。更多内容参见 “`/usr/share/doc/libncurses5/FAQ`”。“`dumb`” 是 “`$TERM`” 中最通用的。

### 8.3.2. 东亚环境下宽度有歧义的字符

在东亚语言环境下，方框绘制、希腊字符和西里尔字符可能会显示得比你预期的样子更宽，这样会导致终端输出排列不再整齐（参见 Unicode 标准附录 #11，4.2 Ambiguous 字符）。

您可以绕过这个问题：

- `gnome-terminal`：首选项 → 配置文件 → 配置名 → 兼容性 → 宽度有歧义的字符 → 窄

- `ncurses`：设置环境变量 `export NCURSES_NO_UTF8_ACS=0`。

第 7 章 GUI（图形用户界面）系统 |  | 第 9 章 系统技巧