# 25.2.使用本地化

FreeBSD 的本地化设置基于三个组件：语言代码、区域代码和编码。区域设置名称由这些部分构成，如下所示：

```sh
语言代码_区域代码.编码
```

*语言代码* 和 *区域代码* 用于确定区域和特定的语言变体。[常见语言和区域代码](https://docs.freebsd.org/en/books/handbook/l10n/#locale-lang-country) 提供了一些 *语言代码\_区域代码* 的示例：

**表 1. 常见语言和区域代码**

| 语言代码\_区域代码 | 描述      |
| ---------- | ------- |
| en\_US     | 英语，美国   |
| ru\_RU     | 俄语，俄罗斯  |
| zh\_TW     | 繁体中文，台湾 |

可以通过键入以下命令查看可用的完整区域设置列表：

```sh
% locale -a | more
```

要查看当前的区域设置：

```sh
% locale
```

语言特定字符集，如 ISO8859-1、ISO8859-15、KOI8-R 和 CP437，在 [multibyte(3)](https://man.freebsd.org/cgi/man.cgi?query=multibyte\&sektion=3\&format=html) 中有描述。活动字符集列表可以在 [IANA 注册表](http://www.iana.org/assignments/character-sets) 中找到。

一些语言，如中文或日语，不能使用 ASCII 字符表示，需要使用宽字符或多字节字符的扩展语言编码。例如，EUC 和 Big5 就是宽字符或多字节编码的例子。较旧的应用程序可能会错误地将这些编码识别为控制字符，而较新的应用程序通常可以识别这些字符。根据实现的不同，用户可能需要为应用程序编译宽字符或多字节字符支持，或正确配置它。

> **注意**
>
> FreeBSD 使用与 Xorg 兼容的区域编码。

本节的其余部分描述了在 FreeBSD 系统上配置区域设置的各种方法。接下来的部分将讨论如何找到和编译支持 i18n 的应用程序。

## 25.2.1. 设置登录 shell 的区域设置

区域设置可以在用户的 **\~/.login\_conf** 文件中或用户 shell 的启动文件中配置：**\~/.profile**、**\~/.bashrc** 或 **\~/.cshrc**。

需要设置两个环境变量：

* `LANG`：设置区域设置
* `MM_CHARSET`：设置应用程序使用的 MIME 字符集

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

有两种方法可以进行所需的变量分配：推荐的方法是通过 [登录类](https://docs.freebsd.org/en/books/handbook/l10n/#login-class)，另一种是通过 [启动文件](https://docs.freebsd.org/en/books/handbook/l10n/#startup-file) 方法。接下来的两个小节将演示如何使用这两种方法。

### 25.2.1.1. 登录类方法

这是推荐的方法，它为每个可能的 shell 分配所需的区域设置和 MIME 字符集环境变量。此设置可以由每个用户执行，也可以由超级用户为所有用户配置。

以下是个最简单的示例，在个人用户的 **.login\_conf** 中为 Latin-1 编码设置两个变量：

```ini
me:\
	:charset=ISO-8859-1:\
	:lang=de_DE.ISO8859-1:
```

以下是一个用户的 **\~/.login\_conf** 示例，为繁体中文 Big5 编码设置变量。由于一些应用程序没有正确遵循区域设置变量，因此需要更多的变量来确保应用程序正确工作：

```ini
# 不希望使用台湾的货币单位和时间格式的用户可以手动更改每个变量
me:\
	:lang=zh_TW.Big5:\
	: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:\
	:charset=big5:\
	:xmodifiers="@im=gcin": # 设置 gcin 为 XIM 输入服务器
```

另外，超级用户可以为系统上的所有用户配置本地化设置。以下变量可以在 **/etc/login.conf** 中设置区域设置和 MIME 字符集：

```ini
language_name|Account Type Description:\
	:charset=MIME_charset:\
	:lang=locale_name:\
	:tc=default:
```

例如，之前提到的 Latin-1 示例在 **/etc/login.conf** 中的配置如下：

```sh
german|German Users Accounts:\
	:charset=ISO-8859-1:\
	:lang=de_DE.ISO8859-1:\
	:tc=default:
```

有关这些变量的更多细节，请参见 [login.conf(5)](https://man.freebsd.org/cgi/man.cgi?query=login.conf\&sektion=5\&format=html)。请注意，它已经包含了预定义的 *russian* 类。

每次编辑 **/etc/login.conf** 后，记得执行以下命令以更新权限数据库：

```sh
# cap_mkdb /etc/login.conf
```

> **注意**
>
> 对于最终用户来说，需要在 **\~/.login\_conf** 上运行命令 `cap_mkdb`，才能使更改生效。

#### 25.2.1.1.1. 更改登录类的实用程序

除了手动编辑 **/etc/login.conf** 外，还可以使用一些实用程序为新创建的用户设置区域设置。

使用 `vipw` 添加新用户时，可以指定 *language* 来设置区域设置：

```ini
user:password:1111:11:language:0:0:User Name:/home/user:/bin/sh
```

使用 `adduser` 添加新用户时，可以为所有新用户预配置默认语言，或为单个用户指定语言。

如果所有新用户使用相同的语言，可以在 **/etc/adduser.conf** 中设置 `defaultclass=language`。

要在创建用户时覆盖此设置，可以在此提示符处输入所需的区域设置：

```sh
Enter login class: default []:
```

或者在调用 `adduser` 时指定区域设置：

```sh
# adduser -class language
```

如果使用 `pw` 添加新用户，则按以下方式指定区域设置：

```sh
# pw useradd user_name -L language
```

要更改现有用户的登录类，可以使用 `chpass`。以超级用户身份调用并提供要编辑的用户名作为参数：

```sh
# chpass user_name
```

### 25.2.1.2. Shell 启动文件方法

不推荐使用这种方法，因为每个使用的 shell 都需要手动配置，每个 shell 有不同的配置文件和语法。例如，要为 `sh` shell 设置德语，可以将以下行添加到 **\~/.profile** 文件中，仅为该用户设置 shell。也可以将这些行添加到 **/etc/profile** 或 **/usr/share/skel/dot.profile** 中，为所有用户设置该 shell：

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

然而，`csh` shell 的配置文件名称和语法不同。以下是在 **\~/.login**、**/etc/csh.login** 或 **/usr/share/skel/dot.login** 中的等效设置：

```sh
setenv LANG de_DE.ISO8859-1
setenv MM_CHARSET ISO-8859-1
```

更复杂的是，配置 Xorg 的语法也取决于所使用的 shell。在 **\~/.xinitrc** 中，`sh` shell 和 `csh` shell 的配置示例如下：

```sh
LANG=de_DE.ISO8859-1; export LANG
```

```sh
setenv LANG de_DE.ISO8859-1
```

## 25.2.2. 控制台设置

控制台提供了多种本地化字体。要查看可用字体列表，可以键入 `ls /usr/share/syscons/fonts`。要配置控制台字体，在 **/etc/rc.conf** 中指定 *font\_name*，不带 **.fnt** 后缀：

```ini
font8x16=font_name
font8x14=font_name
font8x8=font_name
```

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

```ini
scrnmap=screenmap_name
keymap=keymap_name
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)](https://man.freebsd.org/cgi/man.cgi?query=kbdmap\&sektion=1\&format=html)。

`keychange` 条目通常需要用来编程功能键，以匹配所选的终端类型，因为功能键序列不能在键盘映射中定义。

接下来，设置正确的控制台终端类型，在 **/etc/ttys** 中为所有虚拟终端条目配置。以下是 [定义的字符集终端类型](https://docs.freebsd.org/en/books/handbook/l10n/#locale-charset) 的总结：

**表 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 安装相应的控制台。可用的 Port 总结在 [来自 Ports 的可用控制台](https://docs.freebsd.org/en/books/handbook/l10n/#locale-console) 中。安装完成后，查看端口的 **pkg-message** 或 man 页面以获取配置和使用说明。

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

| 语言           | Port 位置                                                                         |
| ------------ | ------------------------------------------------------------------------------- |
| 繁体中文 (BIG-5) | [chinese/big5con](https://cgit.freebsd.org/ports/tree/chinese/big5con/)         |
| 中文/日语/韩语     | [chinese/cce](https://cgit.freebsd.org/ports/tree/chinese/cce/)                 |
| 中文/日语/韩语     | [chinese/zhcon](https://cgit.freebsd.org/ports/tree/chinese/zhcon/)             |
| 日语           | [chinese/kon2](https://cgit.freebsd.org/ports/tree/chinese/kon2/)               |
| 日语           | [japanese/kon2-14dot](https://cgit.freebsd.org/ports/tree/japanese/kon2-14dot/) |
| 日语           | [japanese/kon2-16dot](https://cgit.freebsd.org/ports/tree/japanese/kon2-16dot/) |

如果在 **/etc/rc.conf** 中启用了 `moused`，可能还需要进行额外的配置。默认情况下，[syscons(4)](https://man.freebsd.org/cgi/man.cgi?query=syscons\&sektion=4\&format=html) 驱动程序的鼠标光标占用字符集中的 `0xd0` 到 `0xd3` 范围。如果语言使用该范围，请通过在 **/etc/rc.conf** 中添加以下行来移动鼠标的字符范围：

```sh
mousechar_start=3
```

## 25.2.3. Xorg 设置

[The X Window System](https://docs.freebsd.org/en/books/handbook/x11/#x11) 介绍了如何安装和配置 Xorg。在为 Xorg 配置本地化时，可以从 FreeBSD Ports 获取额外的字体和输入法。应用程序特定的国际化设置，如字体和菜单，可以在 **\~/.Xresources** 文件中进行调整，允许用户在图形应用程序的菜单中查看所选语言。

X 输入法（XIM）协议是 Xorg 标准，用于输入非英文字符。[可用输入法](https://docs.freebsd.org/en/books/handbook/l10n/#locale-xim) 总结了 FreeBSD Ports 中可用的输入法应用程序。额外的 Fcitx 和 Uim 应用程序也可供使用。

**表 4. 可用输入法**

| 语言  | 输入法                                                                                                           |
| --- | ------------------------------------------------------------------------------------------------------------- |
| 中文  | [chinese/gcin](https://cgit.freebsd.org/ports/tree/chinese/gcin/)                                             |
| 中文  | [chinese/ibus-chewing](https://cgit.freebsd.org/ports/tree/chinese/ibus-chewing/)                             |
| 中文  | [chinese/ibus-pinyin](https://cgit.freebsd.org/ports/tree/chinese/ibus-pinyin/)                               |
| 中文  | [chinese/oxim](https://cgit.freebsd.org/ports/tree/chinese/oxim/)                                             |
| 中文  | [chinese/scim-fcitx](https://cgit.freebsd.org/ports/tree/chinese/scim-fcitx/)                                 |
| 中文  | [chinese/scim-pinyin](https://cgit.freebsd.org/ports/tree/chinese/scim-pinyin/)                               |
| 中文  | [chinese/scim-tables](https://cgit.freebsd.org/ports/tree/chinese/scim-tables/)                               |
| 日语  | [japanese/ibus-anthy](https://cgit.freebsd.org/ports/tree/japanese/ibus-anthy/)                               |
| 日语  | [japanese/ibus-mozc](https://cgit.freebsd.org/ports/tree/japanese/ibus-mozc/)                                 |
| 日语  | [japanese/ibus-skk](https://cgit.freebsd.org/ports/tree/japanese/ibus-skk/)                                   |
| 日语  | [japanese/im-ja](https://cgit.freebsd.org/ports/tree/japanese/im-ja/)                                         |
| 日语  | [japanese/kinput2](https://cgit.freebsd.org/ports/tree/japanese/kinput2/)                                     |
| 日语  | [japanese/scim-anthy](https://cgit.freebsd.org/ports/tree/japanese/scim-anthy/)                               |
| 日语  | [japanese/scim-canna](https://cgit.freebsd.org/ports/tree/japanese/scim-canna/)                               |
| 日语  | [japanese/scim-honoka](https://cgit.freebsd.org/ports/tree/japanese/scim-honoka/)                             |
| 日语  | [japanese/scim-honoka-plugin-romkan](https://cgit.freebsd.org/ports/tree/japanese/scim-honoka-plugin-romkan/) |
| 日语  | [japanese/scim-honoka-plugin-wnn](https://cgit.freebsd.org/ports/tree/japanese/scim-honoka-plugin-wnn/)       |
| 日语  | [japanese/scim-prime](https://cgit.freebsd.org/ports/tree/japanese/scim-prime/)                               |
| 日语  | [japanese/scim-skk](https://cgit.freebsd.org/ports/tree/japanese/scim-skk/)                                   |
| 日语  | [japanese/scim-tables](https://cgit.freebsd.org/ports/tree/japanese/scim-tables/)                             |
| 日语  | [japanese/scim-tomoe](https://cgit.freebsd.org/ports/tree/japanese/scim-tomoe/)                               |
| 日语  | [japanese/scim-uim](https://cgit.freebsd.org/ports/tree/japanese/scim-uim/)                                   |
| 日语  | [japanese/skkinput](https://cgit.freebsd.org/ports/tree/japanese/skkinput/)                                   |
| 日语  | [japanese/skkinput3](https://cgit.freebsd.org/ports/tree/japanese/skkinput3/)                                 |
| 日语  | [japanese/uim-anthy](https://cgit.freebsd.org/ports/tree/japanese/uim-anthy/)                                 |
| 韩语  | [korean/ibus-hangul](https://cgit.freebsd.org/ports/tree/korean/ibus-hangul/)                                 |
| 韩语  | [korean/imhangul](https://cgit.freebsd.org/ports/tree/korean/imhangul/)                                       |
| 韩语  | [korean/nabi](https://cgit.freebsd.org/ports/tree/korean/nabi/)                                               |
| 韩语  | [korean/scim-hangul](https://cgit.freebsd.org/ports/tree/korean/scim-hangul/)                                 |
| 韩语  | [korean/scim-tables](https://cgit.freebsd.org/ports/tree/korean/scim-tables/)                                 |
| 越南语 | [vietnamese/xvnkb](https://cgit.freebsd.org/ports/tree/vietnamese/xvnkb/)                                     |
| 越南语 | [vietnamese/x-unikey](https://cgit.freebsd.org/ports/tree/vietnamese/x-unikey/)                               |
