23.2.使用本地化

23.2. 使用本地化

本地化设置主要基于三个部分:语言代码、国家代码和编码。本地化名称是由这些部分构成的,如下所示: LanguageCode_CountryCode.Encoding 语言代码(LanguageCode)和国家代码(CountryCode)用于确定国家和具体的语言变化。通用语言和国家代码提供了一些语言代码_国家代码的例子。

表1. 常见的语言和国家代码

语言代码_国家代码 指代
en_US 英语,美国
ru_RU 俄语,俄罗斯
zh_TW 繁体中文,中国台湾

完整的可用语言列表可以通过输入以下内容找到。

% locale -a | more 要确定当前的地区设置。

% locale 特定语言的字符集,如 ISO8859-1、ISO8859-15、KOI8-R 和 CP437,在 multibyte(3) 中描述。有效的字符集列表可以在 IANA Registry 找到。

有些语言,如中文或日文,不能用 ASCII 字符表示,需要用宽字符或多字节字符进行扩展语言编码。宽字符或多字节编码的例子包括 EUC 和 Big5。旧的应用程序可能会误认为这些编码是控制字符,而新的应用程序通常会识别这些字符。根据不同的实现,用户可能需要编译一个支持宽字符或多字节字符的应用程序,或者对其进行正确的配置。

提示:

FreeBSD 使用与 Xorg 兼容的地区编码。

本节的其余部分将描述在 FreeBSD 系统上配置 locale 的各种方法。下一节将讨论寻找和编译支持 i18n 的应用程序的注意事项。

23.2.1. 为登录 shell 设置地区设置

地区设置是在用户的 ~/.login_conf 或用户 shell 的启动文件中配置的:~/.profile~/.bashrc,或 ~/.cshrc

有两个环境变量应该被设置:

  • LANG,用于设置语言环境。

  • MM_CHARSET,设置应用程序使用的MIME字符集。

除了用户的 shell 配置之外,这些变量还应该为特定的应用程序配置和 Xorg 配置而设置。

有两种方法可用于进行所需的变量分配:登录类方法,这是推荐的方法,以及启动文件方法。接下来的两节将演示如何使用这两种方法。

23.2.1.1. 登录类方法

这第一种方法是推荐的方法,因为它为每个可能的 shell 分配了所需的环境变量,如 locale name 和 MIME 字符集。这个设置可以由每个用户执行,也可以由超级用户为所有用户配置。

这个最小的例子在单个用户的主目录的.login_conf 中为 Latin-1 编码设置了两个变量:

  1. me:\
  2. :charset=ISO-8859-1:\
  3. :lang=de_DE.ISO8859-1:

下面是一个用户的~/.login_conf 的例子,它为 BIG-5 编码的繁体中文设置了变量。因为有些应用程序不能正确地尊重中文、日文和韩文的地域变量,所以需要设置更多的变量:

  1. #Users who do not wish to use monetary units or time formats
  2. #of Taiwan can manually change each variable
  3. me:\
  4. :lang=zh_TW.Big5:\
  5. :setenv=LC_ALL=zh_TW.Big5,LC_COLLATE=zh_TW.Big5,LC_CTYPE=zh_TW.Big5,LC_MESSAGES=zh_TW.Big5,LC_MONETARY=zh_TW.Big5,LC_NUMERIC=zh_TW.Big5,LC_TIME=zh_TW.Big5:\

另外,超级用户可以对系统的所有用户进行本地化配置。在/etc/login.conf 中的以下变量用于设置 locale 和 MIME 字符集:

  1. language_name|Account Type Description:\
  2. :charset=MIME_charset:\
  3. :lang=locale_name:\
  4. :tc=default:

因此,之前的 Latin-1 例子会是这样的:

  1. german|German Users Accounts:\
  2. :charset=ISO-8859-1:\
  3. :lang=de_DE.ISO8859-1:\
  4. :tc=default:

关于这些变量的更多细节,见 login.conf(5)。注意,它已经包含了预先定义的俄语类。

每当编辑/etc/login.conf 时,记得执行以下命令来更新能力数据库。

  1. # cap_mkdb /etc/login.conf

提示:

对于终端用户来说,cap_mkdb 命令需要在他们的 ~/.login_conf 上运行,以使任何改变生效。

23.2.1.1.1. 改变登录类别的实用程序

除了手动编辑 /etc/login.conf 之外,还有几个工具可以用来为新创建的用户设置 locale。

当使用 vipw 添加新用户时,指定语言来设置 locale:

  1. user:password:1111:language:0:0:User Name:/home/user:/bin/sh

当使用adduser添加新用户时,默认语言可以为所有新用户预先配置,也可以为单个用户指定。

如果所有新用户都使用相同的语言,在 /etc/adduser.conf中设置defaultclass=language。

要在创建用户时覆盖这个设置,可以在这个提示下输入所需的地区语言:

  1. Enter login class: default []:

或者在调用 adduser 时指定要设置的 locale:

  1. # adduser -class language

如果使用 pw 来添加新的用户,请按以下方式指定 locale:

  1. # pw useradd user_name -L language

要改变一个现有用户的登录类别,可以使用 chpass。以超级用户身份调用它,并提供要编辑的用户名作为参数:

  1. # chpass user_name

23.2.1.2. shell 启动文件方法

这第二种方法不被推荐,因为每个使用的 shell 都需要手动配置,每个 shell 都有不同的配置文件和不同的语法。举个例子,为了给 sh shell 设置德语,可以在~/.profile中加入这些行,以设置仅适用于该用户的 shell。这些行也可以添加到/etc/profile/usr/share/skel/dot.profile 中,以便为所有用户设置该 shell:

  1. LANG=de_DE.ISO8859-1; export LANG
  2. MM_CHARSET=ISO-8859-1; export MM_CHARSET

然而,对于 csh shell 来说,配置文件的名称和使用的语法是不同的。这些是~/.login、/etc/csh.login/usr/share/skel/dot.login的同等设置:

  1. setenv LANG de_DE.ISO8859-1
  2. setenv MM_CHARSET ISO-8859-1

使问题复杂化的是,在~/.xinitrc中配置 Xorg 所需的语法也取决于 shell。第一个例子是针对 sh shell 的,第二个是针对 csh shell 的:

  1. LANG=de_DE.ISO8859-1; export LANG
  1. setenv LANG de_DE.ISO8859-1

23.2.2. 控制台设置

有几种本地化的字体可用于控制台。要查看可用字体的列表,请输入 ls /usr/share/syscons/fonts。要配置控制台字体,在/etc/rc.conf 中指定font_name,不含.fnt 后缀:

  1. font8x16=font_name
  2. font8x14=font_name
  3. font8x8=font_name

可以通过在 /etc/rc.conf中添加以下内容来设置键盘映射和屏幕映射:

  1. scrnmap=screenmap_name
  2. keymap=keymap_name
  3. keychange="fkey_number sequence"

要查看可用的屏幕映射列表,输入 ls /usr/share/syscons/scrnmaps 。在指定 screenmap_name 时,不要包括 .scm后缀。通常需要一个带有相应映射字体的屏幕地图,作为 VGA 适配器字体字符矩阵上的第 8 位扩展到第 9 位的变通方法,这样,如果屏幕字体使用第 8 位列,字母就会被移出伪图区。

要查看可用的键盘映射列表,请输入 ls /usr/share/syscons/keymaps。当指定 keymap_name 时,不要包括 .kbd 后缀。要在不重启的情况下测试密钥映射,请使用 kbdmap(1)。

由于功能键序列不能在键盘地图中定义,因此通常需要使用 keychange 条目来对功能键进行编程以匹配所选的终端类型。

接下来,在 /etc/ttys 中为所有虚拟终端条目设置正确的控制台终端类型。为字符集定义的终端类型总结了可用的终端类型。

表2. 为字符集定义的终端类型

字符集 终端类型
ISO8859-1或ISO8859-15 cons25l1
ISO8859-2 cons25l2
ISO8859-7 cons25l7
KOI8-R cons25r
KOI8-U cons25u
CP437 (VGA 默认) cons25
US-ASCII cons25w

对于使用宽字符或多字节字符的语言,应从 FreeBSD Ports Collection 中安装适合该语言的控制台。可用的端口在 Ports Collection 的 Available Console 中进行了总结。安装完毕后,请参考 port 的 pkg-message 或 man 页面以了解配置和使用说明。

表 3. 来自 Ports Collection 的可用控制台

语言 port 位置
繁体中文 (BIG-5) chinese/big5con
中文/日语/韩语 chinese/cce
中文/日语/韩语 chinese/zhcon
日语 chinese/kon2
日语 japanese/kon2-14dot
日语 japanese/kon2-16dot

如果在/etc/rc.conf中启用了 moused,可能需要额外的配置。默认情况下,syscons(4) 驱动的鼠标光标在字符集中占据 0xd0-0xd3 的范围。如果语言使用这个范围,请在/etc/rc.conf中添加以下一行来移动光标的范围:

  1. mousechar_start=3

23.2.3. Xorg的设置

X Window System 描述了如何安装和配置 Xorg。在为本地化配置 Xorg 时,额外的字体和输入法可以从 FreeBSD Ports Collection 中获得。应用程序特定的 i18n 设置,如字体和菜单,可以在 ~/.Xresources 中进行调整,并应允许用户在图形化的应用程序菜单中查看他们选择的语言。

X 输入法(XIM)协议是一个 Xorg 标准,用于输入非英语字符。可用的输入法总结了 FreeBSD Ports Collection 中可用的输入法应用程序。另外还有一些 Fcitx 和 Uim 应用。

表 4. 可用的输入法

语言 输入法
中文 chinese/ibus-chewing
中文 chinese/ibus-pinyin
中文 chinese/oxim
中文 chinese/scim-fcitx
中文 chinese/scim-pinyin
中文 chinese/scim-tables
日语 japanese/ibus-anthy
日语 japanese/ibus-mozc
日语 japanese/ibus-skk
日语 japanese/im-ja
日语 japanese/Kinputs
日语 japanese/scim-anthy
日语 japanese/scim-canna
日语 japanese/scim-honnoka
日语 japanese/scim-honoka-plugin-romkan
日语 japanese/scim-honoka-plugin-wnn
日语 japanese/scim-prime
日语 japanese/scim-skk
日语 japanese/scim-tables
日语 japanese/scim-tomoe
日语 japanese/scim-uim
日语 japanese/skkinput
日语 japanese/skkinput3
日语 japanese/uim-anthy
韩语 korean/imhangul
韩语 korean/nabi
韩语 korean/scim-hangul
韩语 korean/scim-tables
越南语 vietnamese/xvnkb
越南语 vietnamese/x-unikey