第 8 章。I18N 和 L10N

目录

8.1. 键盘输入
8.1.1. 使用 IBus 的输入法支持
8.1.2. 日语示例
8.1.3. 禁用输入法
8.2. 显示输出
8.3. 区域设置
8.3.1. 编码基础知识
8.3.2. UTF-8 区域设置的原理
8.3.3. 区域设置的重新配置
8.3.4. “$LANG” 环境变量的值
8.3.5. 仅在 X Window 下的特定区域设置
8.3.6. 文件名编码
8.3.7. 本地化消息和翻译文档
8.3.8. 区域设置的影响

应用程序软件的多语言化 (M17N) 或本地语言支持分 2 个步骤完成。

[Tip] 提示

在 multilingualization、internationalization 和 localization 中,“m” 和 “n”、“i” 和 “n” 或 “l” 和 “n” 之间分别有 17、18 或 10 个字母,这分别对应于 M17N、I18N 和 L10N。

GNOME 和 KDE 等现代软件都是多语言化的。 它们通过使其处理 UTF-8 数据来实现国际化,并通过 gettext(1) 基础设施提供其翻译后的消息来实现本地化。 翻译后的消息可以作为单独的本地化软件包提供。 它们可以通过将相关的环境变量设置为适当的区域设置来简单地选择。

文本数据的最简单表示是 ASCII,它对于英语来说已经足够了,并且使用少于 127 个字符(可以用 7 位表示)。 为了支持更多用于国际支持的字符,人们发明了许多字符编码系统。 现代且明智的编码系统是 UTF-8,它可以处理实际上所有人类已知的字符(请参阅 第 8.3.1 节,“编码基础知识”)。

有关详细信息,请参阅 i18n 简介

国际硬件支持通过本地化的硬件配置数据启用。

8.1. 键盘输入

Debian 系统可以配置为使用多种国际键盘布局。

表 8.1. 键盘重新配置方法列表

环境 命令
Linux 控制台 dpkg-reconfigure --priority=low console-data
X Window dpkg-reconfigure --priority=low xserver-xorg

这通过其死键功能支持许多欧洲语言的带重音字符的键盘输入。 对于亚洲语言,您需要更复杂的 输入法 支持,例如接下来讨论的 IBus

8.1.1. 使用 IBus 的输入法支持

通过使用 IBus 系列软件包和 im-config 软件包,简化了 Debian 系统的多语言输入设置。 IBus 软件包列表如下。


kinput2 方法和其他依赖于区域设置的亚洲经典 输入法 仍然存在,但不建议用于现代 UTF-8 X 环境。 SCIMuim 工具链是现代 UTF-8 X 环境的稍旧的国际输入法方法。

8.1.2. 日语示例

我发现英语环境(“en_US.UTF-8”)下启动的日语输入法非常有用。 以下是我使用 IBus 执行此操作的方法。

  1. 安装日语输入工具包 ibus-mozc 及其推荐的软件包,例如 im-config

  2. 从用户 shell 执行 “im-config” 并选择 “ibus”。

  3. 选择 “系统” → “首选项” → “IBus 首选项” → “输入法” → “选择输入法” → “日语” → “MOZC” 并单击 “添加”。

  4. 重新登录到用户帐户。

  5. 通过 “im-config” 验证设置。

  6. 通过右键单击 GUI 工具栏来设置输入法和模式。 (您可以减少输入法的菜单选择。)

  7. 通过 CTRL-SPACE 启动 IBus 输入法。

请注意以下事项。

  • 如果从 root 或非 root 用户执行命令,im-config(8) 的行为会有所不同。

  • im-config(8) 默认情况下启用系统上最佳的输入法,而无需任何用户操作。

  • 默认情况下禁用 im-config(8) 的 GUI 菜单项,以防止混乱。

8.1.3. 禁用输入法

如果您希望在不通过 XIM 的情况下输入,请在启动程序时将 “$XMODIFIERS” 值设置为 “none”。 如果您在 emacs(1) 上使用日语输入基础设施 egg,则可能是这种情况。 从 shell 中,按如下方式执行。

$ XMODIFIERS=none emacs

为了调整 Debian 菜单执行的命令,请按照 “/usr/share/doc/menu/html” 中描述的方法将自定义配置放置在 “/etc/menu/” 中。

8.2. 显示输出

Linux 控制台只能显示有限的字符。 (您需要使用特殊的终端程序,例如 jfbterm(1),才能在非 X 控制台上显示非欧洲语言。)

只要存在所需的字体数据,X Window 就可以显示 UTF-8 中的任何字符。 (原始字体数据的编码由 X Window 系统处理,并且对用户透明。)

8.3. 区域设置

以下内容侧重于从 gdm3(1) 启动的 X Window 环境下运行的应用程序的区域设置。

8.3.1. 编码基础知识

环境变量 “LANG=xx_YY.ZZZZ” 将区域设置设置为语言代码 “xx”、国家/地区代码 “yy” 和编码 “ZZZZ”(请参阅 第 1.5.2 节,““$LANG” 变量”)。

当前的 Debian 系统通常将区域设置设置为 “LANG=xx_YY.UTF-8”。 这使用 UTF-8 编码和 Unicode 字符集。 UTF-8 编码系统是一种多字节代码系统,可以智能地使用代码点。 ASCII 数据仅由 7 位范围代码组成,始终是有效的 UTF-8 数据,每个字符仅由 1 个字节组成。

以前的 Debian 系统过去常常将区域设置设置为 “LANG=C” 或 “LANG=xx_YY”(没有 “.UTF-8”)。

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

  • Unix 中的传统编码系统用于 “LANG=xx_YY”。

用于 “LANG=xx_YY” 的实际传统编码系统可以通过检查 “/usr/share/i18n/SUPPORTED” 来识别。 例如,“en_US” 使用 “ISO-8859-1” 编码,而 “fr_FR@euro” 使用 “ISO-8859-15” 编码。

[Tip] 提示

有关编码值的含义,请参阅 表 11.2,“编码值及其用法列表”

8.3.2. UTF-8 区域设置的原理

UTF-8 编码是用于 I18N 的现代且明智的文本编码系统,能够表示 Unicode 字符,即实际上所有人类已知的字符。 UTF 代表 Unicode 转换格式 (UTF) 方案。

我建议为您的桌面使用 UTF-8 区域设置,例如 “LANG=en_US.UTF-8”。 区域设置的第一部分决定了应用程序显示的消息。 例如,在 “LANG=fr_FR.UTF-8” 区域设置下,gedit(1)(GNOME 桌面的文本编辑器)可以显示和编辑中文字符文本数据,同时以法语显示菜单,只要安装了所需的字体和输入法。

我还建议仅使用 “$LANG” 环境变量设置区域设置。 我看不到在 UTF-8 区域设置下设置复杂的 “LC_*” 变量组合(请参阅 locale(1))有什么好处。

即使是纯英文文本也可能包含非 ASCII 字符,例如,ASCII 中不提供左引号和右引号。

“double quoted text”
‘single quoted text’

ASCII 纯文本数据转换为 UTF-8 时,它与原始 ASCII 文本数据具有完全相同的内容和大小。 因此,部署 UTF-8 区域设置不会有任何损失。

某些程序在支持 I18N 后会消耗更多内存。 这是因为它们的编码使用 UTF-32(UCS4) 在内部支持 Unicode 以实现速度优化,并且每个 ASCII 字符数据消耗 4 个字节,而与选择的区域设置无关。 同样,部署 UTF-8 区域设置不会有任何损失。

特定于供应商的旧的非 UTF-8 编码系统往往在某些字符(例如许多国家/地区的图形字符)上存在细微但令人讨厌的差异。 现代操作系统部署 UTF-8 系统实际上解决了这些冲突的编码问题。

8.3.3. 区域设置的重新配置

为了使系统能够访问特定的区域设置,必须从区域设置数据库编译区域设置数据。 (除非您安装了 locales-all 软件包,否则 Debian 系统附带所有可用的预编译区域设置。)可在 “/usr/share/i18n/SUPPORTED” 中列出可用于编译的完整受支持区域设置列表。 这列出了所有正确的区域设置名称。 以下列出了所有已编译为二进制形式的可用 UTF-8 区域设置。

$ locale -a | grep utf8

以下命令执行重新配置 locales 软件包。

# dpkg-reconfigure locales

此过程涉及 3 个步骤。

  1. 更新可用区域设置列表

  2. 将它们编译为二进制形式

  3. 在 “/etc/defaults/locale” 中设置系统范围的默认区域设置值,供 PAM 使用(请参阅 第 4.5 节,“PAM 和 NSS”

可用区域设置列表应包括 “en_US.UTF-8” 和所有带有 “UTF-8” 的感兴趣的语言。

推荐的默认区域设置是 “en_US.UTF-8”,用于美国英语。 对于其他语言,请确保选择带有 “UTF-8” 的区域设置。 这些设置中的任何一个都可以处理任何国际字符。

[Note] 注意

虽然将区域设置设置为 “C” 使用美国英语消息,但它仅处理 ASCII 字符。

8.3.4. “$LANG” 环境变量的值

$LANG” 环境变量的值由许多应用程序设置和更改。

  • login(1) 的 PAM 机制为本地 Linux 控制台程序初始设置

  • 由显示管理器的 PAM 机制为所有 X 程序初始设置

  • ssh(1) 的 PAM 机制为远程控制台程序初始设置

  • 由某些显示管理器(例如 gdm3(1))为所有 X 程序更改

  • 通过 “~/.xsessionrc” 由 X 会话启动代码为所有 X 程序更改(lenny 功能)

  • 由 shell 启动代码(例如 “~/.bashrc”)为所有控制台程序更改

[Tip] 提示

建议将系统范围的默认区域设置安装为 “en_US.UTF-8”,以获得最大的兼容性。

8.3.5. 仅在 X Window 下的特定区域设置

您可以使用 PAM 自定义(请参阅 第 4.5 节,“PAM 和 NSS”)选择仅在 X Window 下的特定区域设置,而与系统范围的默认区域设置无关,如下所示。

此环境应为您提供最佳的桌面体验和稳定性。 即使 X Window 系统无法正常工作,您也可以访问具有可读消息的功能字符终端。 这对于使用非罗马字符的语言(如中文、日语和韩语)至关重要。

[Note] 注意

可能还有另一种方法可用作 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/defaults/locale-x” 文件,其中包含以下内容。

LANG="ja_JP.UTF-8"

将默认的 “/etc/defaults/locale” 文件保留为其他程序,如下所示。

LANG="en_US.UTF-8"

这是自定义区域设置的最通用技术,并使 gdm3(1) 本身的菜单选择对话框本地化。

或者对于这种情况,您也可以简单地使用 “~/.xsessionrc” 文件更改区域设置。

8.3.6. 文件名编码

对于跨平台数据交换(请参阅 第 10.1.10 节,“可移动存储设备”),您可能需要使用特定的编码来挂载某些文件系统。 例如,vfat 文件系统mount(8) 在不使用选项的情况下假定为 CP437。 您需要提供显式挂载选项以将 UTF-8CP932 用于文件名。

[Note] 注意

在现代桌面环境(如 GNOME)下自动挂载热插拔 USB 记忆棒时,您可以通过右键单击桌面上的图标,单击 “驱动器” 选项卡,单击展开 “设置”,然后在 “挂载选项:” 中输入 “utf8” 来提供此类挂载选项。 下次挂载此记忆棒时,将启用 UTF-8 挂载。

[Note] 注意

如果您正在升级系统或从较旧的非 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

8.3.7. 本地化消息和翻译文档

Debian 系统中显示的许多文本消息和文档(例如错误消息、标准程序输出、菜单和手册页)都存在翻译。 GNU gettext(1) 命令工具链 用作大多数翻译活动的后端工具。

aptitude(8) 在 “任务” → “本地化” 下列出了广泛的有用二进制软件包列表,这些软件包为应用程序添加了本地化消息并提供了翻译文档。

例如,您可以通过安装 manpages-<LANG> 软件包来获取手册页的本地化消息。 要从 “/usr/share/man/it/” 读取 <programname> 的意大利语手册页,请按如下方式执行。

LANG=it_IT.UTF-8 man <programname>

8.3.8. 区域设置的影响

sort(1) 的字符排序顺序受区域设置的语言选择的影响。 西班牙语和英语区域设置的排序方式不同。

ls(1) 的日期格式受区域设置的影响。 “LANG=C ls -l” 和 “LANG=en_US.UTF-8” 的日期格式不同(请参阅 第 9.2.5 节,“自定义时间和日期显示”)。

数字标点符号对于不同的区域设置是不同的。 例如,在英语区域设置中,一千零一点一显示为 “1,000.1”,而在德语区域设置中,它显示为 “1.000,1”。 您可能会在电子表格程序中看到这种差异。