第 8 章 国际化和本地化

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

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

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

[提示]提示

在 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) 编写的,所以其内容正在变得过时。

8.1. 键盘输入

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

  1. # dpkg-reconfigure keyboard-configuration
  2. # dpkg-reconfigure console-setup

这将配置 Linux 控制台和 X 窗口的键盘,并更新 “/etc/default/keyboard” 和 “/etc/default/console-setup” 中的配置参数。这也可以用来配置 Linux 控制台的字体。

许多非 ASCII 字符,包括许多欧洲语言使用的重音字符,可以使用 死键AltGr 键组合键 来输入它们。

对于亚洲语言,你需要更复杂的输入法支持,例如下面将要讨论的 IBus

8.1.1. IBus 支持的输入法

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

  1. 键盘 应用程序
  2. | ^
  3. | |
  4. +-> Linux 内核 -> 输入法 -> GtkQt、或 X

通过 im-config 使用 IBus 家族的软件包可以简单地为 Debian 系统建立多语种的输入。下面列出了一些 IBus 软件包。

表 8.1. IBus 支持的输入法

软件包流行度大小支持的语言环境
ibusV:70, I:871581使用 dbus 的输入方式框架
ibus-mozcV:1, I:2999日文
ibus-anthyV:0, I:18723同上
ibus-kkcV:0, I:0214同上
ibus-skkV:0, I:0244同上
ibus-pinyinV:0, I:11434中文(zh_CN)
ibus-chewingV:0, I:0415中文 (zh_TW)
ibus-hangulV:0, I:1288韩文
ibus-tableV:0, I:11801IBus 表引擎
ibus-table-thaiI:047泰文
ibus-unikeyV:0, I:0318越南语
ibus-m17nV:0, I:1187多语言:印度语、阿拉伯语和其它

kinput2 方式和其它本地独立的亚洲经典输入法依旧存在,但不推荐在现代的 UTF-8 X 环境中使用。SCIMuim 工具链是用于现代的 UTF-8 X 环境下的国际化输入法的较旧的方法。

8.1.2. 一个日语的例子

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

  1. 安装日文输入法软件包 ibus-anthy ,以及im-config等推荐的软件包.

  2. 从用户Shell中执行”im-config“,然后选择”ibus“作为输入法.

  3. 选择 “Settings” → “Keyboard” → “Input Sources” → 在”Input Sources”中单击 “+“ → “Japanese” → “Japanese (anthy)”, 然后单击”Add”.

  4. 选择”日语”并”添加”到支持日语键盘,就不需要字符转换。(你可能会选择更多的输入源)

  5. 重新登录用户账户。

  6. 使用”im-config“验证设置.

  7. 右键单击 GUI 工具条图标,设置输入源。

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

请注意以下几点。

  • im-config(8)如果命令是从root账户执行的表现会有所不同。

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

  • 用户界面菜单入口im-config(8) 默认会被禁用,以免造成混乱。

8.1.3. 禁用输入法

如果你不想通过 XIM(X 所使用的机制)来进行输入,你可以在启动程序时将 “$XMODIFIERS” 的值设置为 “none”。这可能会是这种情况,你想在 emacs(1) 中使用日文输入基础设施 egg 同时禁用 ibus。你可以从 shell 中执行如下命令。

  1. $ XMODIFIERS=none emacs

为了调整 Debian 菜单执行的命令,请根据 “/usr/share/doc/menu/html” 中描述的方法定制 “/etc/menu/” 中的配置。

8.2. 显示输出

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

只要需要的字库数据存在X窗口可以通过UTF-8编码显示任意字符。(X窗口系统能够维护好原始字体数据编码,这对用户来说是透明的)

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

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

您可以绕过这个问题:

  • gnome-terminal:编辑 → 首选项 → 配置文件 → 编辑 → 兼容性 → 宽度有歧义的字符 → 窄

  • ncurses:设置环境变量 export NCURSES_NO_UTF8_ACS=0

8.4. 语言环境

下面重点介绍在从 gdm3(1) 启动的 X 窗口环境下运行的应用程序的语言设置。

8.4.1. 编码的基础知识

环境变量 “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 “编码值和用法的列表”

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

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 中是不可用的。

  1. “双引号的文本” 并非 “双引号的 ASCII
  2. ‘单引号的文本’ 并非 ‘单引号的 ASCII

当纯 ASCII 文本数据转换为 UTF-8 后,它会具有与原本完全相同的内容和大小。因此使用 UTF-8 语言环境并不会使你损失什么。

一些程序在支持 I8N 后会消耗更多的内存。这是因为它们为了速度优化,而在内部使用 UTF-32(UCS4) 来支持 Unicode,并且每个独立于语言环境所选的 ASCII 字符数据都会消耗 4 个字节。再一次地,使用 UTF-8 语言环境并不会使你损失什么。

供应商指定的旧的非 UTF-8 编码系统在一些字符上往往有较小但恼人的不同,例如许多国家使用的字形。而使用了 UTF-8 系统的现代操作系统基本上能解决这行编码冲突问题。

8.4.3. 语言环境的重新配置

为了使系统访问特定的语言环境,必须从语言环境数据库编译相应语言环境数据。(Debian 系统带有所有提前编译的可用语言环境,除非你安装 locales-all 软件包。)所支持的可编译语言环境的完整列表位于 “/usr/share/i18n/SUPPORTED”,它列出了所有准确的语言环境名称。下列命令列出已编译成二进制形式的所有可用的 UTF-8 语言环境。

  1. $ locale -a | grep utf8

下列的命令会重新配置 locales 软件包。

  1. # dpkg-reconfigure locales

该过程包含 3 个步骤。

  • 更新可用的语言环境列表

  • 将它们编译为二进制形式

    1. 在 “/etc/default/locale” 设置系统默认的语言环境值给 PAM 使用(参见 第 4.5 节 “PAM 和 NSS”

可用的语言环境列表应该包含 “en_US.UTF-8” 和所有你感兴趣的带有 “UTF-8” 的语言。

对于美式英语,推荐默认的语言环境为 “en_US.UTF-8”。对于其它语言,请确保所选的语言环境带有 “UTF-8”。这些设置中的任何一个都能够处理任何国际字符。

[注意]注意

虽然将语言环境设置为 “C” 会使用美式英语,但它只处理 ASCII 字符。

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

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

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

  • 显示管理器的 PAM 机制为所有的 X 程序进行了最初的设置

  • ssh(1) 的 PAM 机制为远程控制台程序进行了最初的设置

  • 一些显示管理器,例如 gdm3(1) 会为所有 X 程序改变设置

  • 通过 “~/.xsessionrc”,X 会话启动码会为所有 X 程序改变设置

  • shell 启动码,例如 “~/.bashrc”,会为所有控制台程序改变设置

[提示]提示

将系统默认语言环境设置为 “en_US.UTF-8” 能够获得最大的兼容性。

8.4.5. 只用于 X 窗口的特定语言环境

你可以像下面那样选择只用于 X 窗口的特定语言环境,而不管你的系统使用 PAM 定制(参见 第 4.5 节 “PAM 和 NSS”)的默认语言环境。

这个环境能够给你提供最好的桌面体验,并保持稳定。即使 X 窗口系统不工作,你也可以访问带有可读信息的多功能字符终端。这对于使用非罗马字符(如中文,日语和韩语)的语言来说是必不可少的。

[注意]注意

改善 X 会话管理软件包可能会使另一种可用的方法,但请阅读下面的内容作为设置语言环境的通用和基础的方法。对于 gdm3(1),我们知道你能够通过它的菜单来选择 X 会话的语言环境。

在 PAM 配置文件中的下面这行定义了语言环境的文件位置,例如 “/etc/pam.d/gdm3”。

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

将这行改成下面那样。

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

对于中文,建立一个带有 “-rw-r--r-- 1 root root” 权限的 “/etc/default/locale-x” 文件,并包含下面这行。

  1. LANG="zh_CN.UTF-8"

保持用于其它程序的默认 “/etc/default/locale” 文件有下面这行。

  1. LANG="en_US.UTF-8"

这是定制语言环境最通用的技术,并且会使 gdm3(1) 本身的菜单选择对话框被本地化。

对于该情况的另一种解决方法是使用 “~/.xsessionrc” 文件来改变语言环境。

8.4.6. 文件名编码

对于跨平台的数据交换(参见 第 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 表示为日语。

8.4.7. 本地化信息和翻译文档

在 Debian 系统中显示的许多文档和文本信息有翻译存在,比如错误信息、标准程序输出、菜单和手册页。GNU gettext(1) 命令工具链是大部分翻译活动的后端工具。

aptitude(8) 里,”Tasks” → “Localization” 提供一个有用的二进制包扩展列表, 给应用程序增加本地化信息和提供翻译文档。

举个例子,你可以安装 manpages-<LANG> 包来获得本地化 man 手册页信息。从 “/usr/share/man/it/“ 来读取 <programname> 意大利语的 man 手册页 ,执行下面的操作。

  1. LANG=it_IT.UTF-8 man <programname>

8.4.8. 语言环境的影响

sort(1) 的字符排序,受 语言环境的影响. 西班牙语和英语语言环境排序是不一样的。

ls(1) 的日期格式受语言环境影响. “LANG=C ls -l“ 和 “LANG=en_US.UTF-8“ 的日期格式是不一样的(参见 第 9.2.5 节 “定制时间和日期的显示”).

不同语言环境的数字标点不一样.比如说,英语语言环境中, 一千点一显示为 “1,000.1“,而在德语语言环境中,它显示为 “1.000,1“. 你可以在电子表格程序里面看到这个不同。