FreeBSD 使用手册
上一页 | 第23章 　本地化－I18N/L10N使用和设置 | 下一页

# 23.3 使用本地化语言

I18N不是FreeBSD特有的，它是一个规则。我们鼓励您帮助FreeBSD完善这一规则。

本地化设置需要具备三个条件：语言代码 (Language Code)、 国家代码 (Country Code) 和编码(Encoding)。 本地名字可以用下面这些部分来构造：

    语言代码_国家代码.编码

## 23.3.1 语言和国家代码

为了用特殊的语言来对FreeBSD系统进行本地化（或其他类UNIX®系统）， 用户必须要知道相应的国家和语言代码（国家代码告诉应用程序使用哪一种语言规范）。 此外，WEB浏览器，SMTP/POP服务器，web服务器等都是以这个为基础的。下面就是一个国家和语言代码的例子:

语言/国家代码 | 描述
--- | ---
en_US | 美国英语
ru_RU | 俄语
zh_CN | 简体中文

## 23.3.2 编码

一些语言不使用 ASCII 编码，它们使用8-位， 宽或多字节的字符， 更多的信息请参考 multibyte(3)。 比较老的应用程序可能会无法识别它们， 并误认为是控制字符。 比较新的应用程序通常会认出 8-位字符。 随实现的不同， 用户可能不得不将宽或多字节字符支持编入应用程序， 或进行一些额外的配置， 才能够正常使用它们。 要输入和处理宽或多字节字符， FreeBSD Ports Collection 已经为每种语言提供了不同的程序。 请参考各个 FreeBSD Port 中的 I18N 文档。

特别需要指出的是， 用户可能需要查看应用程序的文档， 以确定如何正确地配置它， 或需要为 configure/Makefile/编译器 指定什么样的参数。

记住下面这些:

- 特定语言的简单C字符集 (参见 multibyte(3))，例如 ISO8859-1, ISO8859-15, KOI8-R, CP437。

- 宽字节或多字节编码，如EUC, Big5。

您可以在IANA Registry检查一下现行的字符集列表。

> 注意: 与此不同的是， FreeBSD 使用与 X11-兼容的本地编码模式。

## 23.3.3 I18N应用程序

在FreeBSD Ports和Package系统里面，I18N应用程序已经使用`I18N` 来命名。然而它们不是总支持需要的语言。

## 23.3.4 本地化设置

通常只要在登入shell里面设置`LANG`为本地化， 一般通过设置用户的 `~/.login_conf` 或用户shell的启动文件（`~/.profile`，`~/.bashrc`, `~/.cshrc`）。没有必要设置 `LC_CTYPE`，`LC_CTIME`。 更多的信息请参考特定语言的FreeBSD文档。

您应当在您的配置文件中设置下面两个变量：

- `LANG` 为POSIX®设置本地化语言功能。

- `MM_CHARSET`应用程序的MIME字符集。

这包括用户的shell配置，特定的应用配置和X11配置。

### 23.3.4.1 设置本地化的方法

有两种方法来设置本地化，接下来都会描述。 第一种 (推荐) 就是在 登入分类 里面指定环境变量。 第二种方法是把环境变量加到shell的启动文件里面。

#### 23.3.4.1.1 登入分类方法

这种方法允许把本地化名称和MIME字符集的环境变量赋给可能的shell， 而不是加到每个特定shell的启动文件里面。 用户级设置 Level Setup 允许普通用户自己完成这个设置，而管理员级设置需要超级用户权限。

##### 23.3.4.1.1.1 用户级设置

这有一个设置用户根目录文件`.login_conf`的小例子， 它为上述两个变量设置了Latin-1编码。

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

这是一个为`.login_conf`设置繁体中文的BIG-5编码的例子。应该设置下面的大部分变量， 因为很多软件都没有为中文，日文和韩文设置正确的本地化变量。

    #Users who do not wish to use monetary units or time formats
    #of Taiwan can manually change each variable
    me:\
        :lang=zh_TW.Big5:\
        :setenv=LC_ALL=zh_TW.Big5:\
        :setenv=LC_COLLATE=zh_TW.Big5:\
        :setenv=LC_CTYPE=zh_TW.Big5:\
        :setenv=LC_MESSAGES=zh_TW.Big5:\
        :setenv=LC_MONETARY=zh_TW.Big5:\
        :setenv=LC_NUMERIC=zh_TW.Big5:\
        :setenv=LC_TIME=zh_TW.Big5:\
        :charset=big5:\
        :xmodifiers="@im=gcin": #Set gcin as the XIM Input Server

更多的信息参考管理员级设置和login.conf(5)

##### 23.3.4.1.1.2 管理员级设置

检查用户的登入分类在 `/etc/login.conf`里面是否设置了正确的语言。主要确定下面的几个设置：

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

再次使用前面的Latin-1编码的例子：

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

在修改用户的登入类型之前， 应首先执行下面的命令：

    # cap_mkdb /etc/login.conf

以便使在 `/etc/login.conf` 中新增的配置生效。

#### 使用 vipw(8) 改变登入类型。

使用`vipw`添加新用户，看起来像下面这样：

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

#### 用adduser(8)改变登入类型。

用`adduser`添加新用户看起来像下面这样：

- 在`/etc/adduser.conf`里面设置`defaultclass = `语言``。应该记住，您必须为使用其它语言的所有用户设置 `缺省`类别。

- 每一次使用adduser(8)的时候，一个特定语言的可选择性回答会像下面这样给出：

      Enter login class: default []:

- 如果您打算给每一个用户使用另外一种语言，您应该这样：

      # adduser -class language

#### 使用pw(8)改变登入类型。

如果您使用pw(8)来添加新用户，应该这样使用：

    # pw useradd user_name -L language

#### 23.3.4.1.2 Shell启动文件方法

> 注意: 不推荐使用这种方法，因为它需要给每一个可能的shell程序一个不同的启动文件。 应该用登入分类方法来代替这种方法。

为了设置本地化名称和MIME字符集，只要在`/etc/profile`或 `/etc/csh.login`启动文件里面设置这两个变量。下面我们使用德语做例子：

在`/etc/profile`里面：

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

或在`/etc/csh.login`里面：

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

另外，您可以把上面的设置添加到`/usr/share/skel/dot.profile` （和前面的`/etc/profile`一样），或者`/usr/share/skel/dot.login` （和前面的`/etc/csh.login`一样）。

对于X11：

在`$HOME/.xinitrc`里面：

    LANG=de_DE.ISO8859-1; export LANG

或者：

    setenv LANG de_DE.ISO8859-1

依赖您的shell(看上面）。

## 23.3.5 控制台设置

对于所有的简单C字符集，在`/etc/rc.conf`中用正在讨论的语言设置正确的控制台字符：

    font8x16=font_name
    font8x14=font_name
    font8x8=font_name

这儿的`font_name`来自于`/usr/share/syscons/fonts`目录， 不带`.fnt`后缀。

如果需要的话， 还应通过 `sysinstall` 来配置与单字节 C 字符集对应的 keymap 和 screenmap。 在 sysinstall 中， 选择 Configure 之后选择 Console 即可进行配置。 除此之外， 您也可以在 `/etc/rc.conf` 中加入类似下面的配置：

    scrnmap=screenmap_name
    keymap=keymap_name
    keychange="fkey_number sequence"

这儿的`screenmap_name`是来自`/usr/share/syscons/scrnmaps`目录， 不带`.scm`后缀。 一个带影射字体的屏幕布局通常被作为一个工作区， 用来在VGA适配器字体矩阵上扩展8位到9位。 如果屏幕字体是使用一个8位的排列，要移动这些字母离开这些区域。

如果您在`/etc/rc.conf`里面启用了moused daemon：

    moused_enable="YES"

那么需要在下一段检查鼠标指针信息。

默认情况下， syscons(4)驱动程序的鼠标指针在字符集中占用0xd0-0xd3的范围。 如果您的语言使用这个范围，您必须把指针范围移出这个范围。 要绕过这个问题， 需要在 `/etc/rc.conf` 中加入：

    mousechar_start=3

这里， `keymap_name` 来自于 `/usr/share/syscons/keymaps` 目录， 但去掉了 `.kbd` 后缀。 如果不确定应该使用哪一个键盘布局， 则可以使用 kbdmap(1) 来测试， 而无需反复重启。

通常， `keychange` 是设定功能键时， 匹配选定的终端类型来说是必需的， 因为功能键序列无法在键盘布局中定义。

此外您还应该检查并确认在 `/etc/ttys` 中已经为所有的 `ttyv*` 项配置了正确的终端类型。 目前， 相关的默认定义是：

字符集设置 | 终端类型
--- | ---
ISO8859-1 or ISO8859-15 | `cons25l1`
ISO8859-2 | `cons25l2`
ISO8859-7 | `cons25l7`
KOI8-R | `cons25r`
KOI8-U | `cons25u`
CP437 (VGA default) | `cons25`
US-ASCII | `cons25w`

对于多字节字符语言，可以您的在 `/usr/ports/`language`` 目录中使用正确的FreeBSD port。一些port以控制台出现， 而系统把它作为串行vtty终端，因此， 必须为 X11 和伪串行控制台准备足够的vtty终端。 下面是在控制台中使用其他语言的应用程序的部分列表：

语言 | 特定区域
--- | ---
Traditional Chinese (BIG-5) | `chinese/big5con`
Japanese | `japanese/kon2-16dot` or `japanese/mule-freewnn`
Korean | `korean/han`

## 23.3.6 X11设置

虽然X11不是FreeBSD计划的一部分， 但我们已经为FreeBSD用户包含了一些信息。 具体细节可以参考Xorg Web 站点 或是您使用的 X11 Server 的网站。

在`~/.Xresources`里面，您可以适当调整特定应用程序的I18N设置（如字体，菜单等）。

### 23.3.6.1 显示字体

安装 Xorg 服务器 (`x11-servers/xorg-server`) 或 XFree86™ 服务器 (`x11-servers/XFree86-4-Server`)， 然后安装对应语言的 TrueType® 字体。 请设置正确的地区信息， 这将让您能够在菜单和其它地方看到所选择的语言。

### 23.3.6.2 输入非英语字符

X11输入方法（XIM）协议是所有X11客户端的一个新标准。 所有将作为XIM客户端来写的X11应用程序从XIM输入服务器输入。 不同的语言有几种XIM服务器可用。

## 23.3.7 打印机设置

一些简单的C字符集通常是用硬编码来编码进打印机的。更宽或多位的字符集需要特定的设置， 我们推荐使用apsfilter。您也可以使用特定语言转换器把文档转换为 PostScript®或PDF格式。

## 23.3.8 内核和文件系统

FreeBSD 的快速文件系统 (FFS) 是完全支持 8-位 字符的， 因此它可以被用于任何简单的 C 字符集 (参见 multibyte(3))， 但在文件系统中不会保存字符集的名字； 也就是说， 它不加修改地保存 8-位信息， 而并不知道如何编码。 正式说来， FFS 目前还不支持任何形式的宽或多字节字符集。 不过， 某些宽或多字符集提供了独立的针对 FFS 的补丁来帮助启用关于它们的支持。 目前这些要么是无法移植的， 要么过于粗糙， 因此我们不打算把它们加入到源代码中。 请参考相关语言的 Web 站点， 以了解关于这些补丁的进一步情况。

FreeBSD MS-DOS®已经能够配置成用在MS-DOS上，Unicode字符集和可选的FreeBSD文件系统字符集的更多信息， 请参考 mount_msdosfs(8) 联机手册。

上一页 | 起始页 | 下一页
基础知识 | 上一级 | 编译I18N程序

本文档和其它文档可从这里下载：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读文档，如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.