---
title: 第 24 章 本地化－I18N/L10N使用和设置
part: 部分 III. 系统管理
prev: books/handbook/virtualization
next: books/handbook/cutting-edge
showBookMenu: true
weight: 28
path: "/books/handbook/"
---

[[l10n]]
= 本地化－I18N/L10N使用和设置
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 24
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/l10n/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

[[l10n-synopsis]]
== 概述

FreeBSD是一个由分布于全世界的用户和贡献者支持的项目。 这章将讨论FreeBSD的国际化和本地化的问题,允许非英语用户也能使用FreeBSD很好地工作。 在系统和应用水平上，主要是通过执行i18N标准来实现的，所以这里我们将为读者提供详细的介绍。

读完这一章，您将了解：

* 不同的语言和地域是如何在现代操作系统上进行编码的。 
* 如何为您的登入shell设置本地化。
* 如何配置您的控制台为非英语语言。 languages.
* 如何使用不同的语言来有效地使用X Windows。
* 在哪里可以找到更多有关开发符合i18N标准的应用程序的信息。

阅读这章之前，您应当了解：

* 怎样安装额外的第三方程序（crossref:ports[ports,安装应用程序. Packages 和 Ports]）。

[[l10n-basics]]
== 基础知识

=== I18N/L10N 是什么？

开发人员把internationalization简写成I18N,中间的数字是前后两个字母间的字母个数。 L10N依据"localization" 使用同样的命名规则。 I18N/L10N方法、协议和应用结合在一起，允许用户使用他们自己所选择的语言。

I18N应用程序使用I18N工具来编程。它允许开发人员写一个简单的文件， 就可以将显示的菜单和文本翻译成本地语言。我们非常鼓励程序员遵循这种规则。

=== 为什么要使用I18N/L10N?

I18N/L10N标准能够很好地支持您查看、输入或处理非英语语言。

=== I18N支持哪些语言？

I18N和L10N不是FreeBSD特有的。当前，它能支持世界上绝大部分主力语言， 包括但不限于：中文，德文，日文，朝鲜文，法文，俄文，越南文等等。

[[using-localization]]
== 使用本地化语言

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

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

[.programlisting]
....
语言代码_国家代码.编码
....

=== 语言和国家代码

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

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| 语言/国家代码
| 描述

|en_US
|美国英语

|ru_RU
|俄语

|zh_CN
|简体中文
|===

=== 编码

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

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

记住下面这些:

* 特定语言的简单C字符集 (参见 man:multibyte[3])，例如 ISO8859-1, ISO8859-15, KOI8-R, CP437。
* 宽字节或多字节编码，如EUC, Big5。

您可以在link:http://www.iana.org/assignments/character-sets[IANA Registry]检查一下现行的字符集列表。

[NOTE]
====
与此不同的是， FreeBSD 使用与 X11-兼容的本地编码模式。
====

=== I18N应用程序

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

[[setting-locale]]
=== 本地化设置

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

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

* `LANG` 为POSIX(R)设置本地化语言功能。
* ``MM_CHARSET``应用程序的MIME字符集。

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

==== 设置本地化的方法

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

[[login-class]]
===== 登入分类方法

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

[[usr-setup]]
====== 用户级设置

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

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

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

[.programlisting]
....
#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
....

更多的信息参考<<adm-setup,管理员级设置>>和man:login.conf[5]

[[adm-setup]]
===== 管理员级设置

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

[.programlisting]
....
language_name|Account Type Description:\
	:charset=MIME_charset:\
	:lang=locale_name:\
	:tc=default:
....

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

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

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

[source,shell]
....
# cap_mkdb /etc/login.conf
....

以便使在 [.filename]#/etc/login.conf# 中新增的配置生效。

===== 使用 man:vipw[8] 改变登入类型。

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

[.programlisting]
....
user:password:1111:11:language:0:0:User Name:/home/user:/bin/sh
....

===== 用man:adduser[8]改变登入类型。

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

* 在[.filename]##/etc/adduser.conf##里面设置``defaultclass = 语言``。应该记住，您必须为使用其它语言的所有用户设置 ``缺省``类别。 
* 每一次使用man:adduser[8]的时候，一个特定语言的可选择性回答会像下面这样给出： 
+
[source,shell]
....
Enter login class: default []: 
....

* 如果您打算给每一个用户使用另外一种语言，您应该这样： 
+
[source,shell]
....
# adduser -class language
....

===== 使用man:pw[8]改变登入类型。

如果您使用man:pw[8]来添加新用户，应该这样使用：

[source,shell]
....
# pw useradd user_name -L language
....

[[startup-file]]
===== Shell启动文件方法

[NOTE]
====
不推荐使用这种方法，因为它需要给每一个可能的shell程序一个不同的启动文件。 应该用<<login-class,登入分类方法>>来代替这种方法。 
====

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

在[.filename]##/etc/profile##里面：

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

或在[.filename]##/etc/csh.login##里面：

[.programlisting]
....
setenv LANG de_DE.ISO8859-1
setenv MM_CHARSET ISO-8859-1
....

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

对于X11：

在[.filename]##$HOME/.xinitrc##里面：

[.programlisting]
....
LANG=de_DE.ISO8859-1; export LANG
....

或者：

[.programlisting]
....
setenv LANG de_DE.ISO8859-1
....

依赖您的shell(看上面）。

[[setting-console]]
=== 控制台设置

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

[.programlisting]
....
font8x16=font_name
font8x14=font_name
font8x8=font_name
....

这儿的__font_name__来自于[.filename]##/usr/shared/syscons/fonts##目录， 不带[.filename]##.fnt##后缀。

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

[.programlisting]
....
scrnmap=screenmap_name
keymap=keymap_name
keychange="fkey_number sequence"
....

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

如果您在[.filename]##/etc/rc.conf##里面启用了moused daemon：

[.programlisting]
....
moused_enable="YES"
....

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

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

[.programlisting]
....
mousechar_start=3
....

这里， _keymap_name_ 来自于 [.filename]#/usr/shared/syscons/keymaps# 目录， 但去掉了 [.filename]#.kbd# 后缀。 如果不确定应该使用哪一个键盘布局， 则可以使用 man:kbdmap[1] 来测试， 而无需反复重启。

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

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

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| 字符集设置
| 终端类型

|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`
|===

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

[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| 语言
| 特定区域

|Traditional Chinese (BIG-5)
|package:chinese/big5con[]

|Japanese
|package:japanese/kon2-16dot[] or package:japanese/mule-freewnn[]

|Korean
|package:korean/han[]
|===

=== X11设置

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

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

==== 显示字体

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

==== 输入非英语字符

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

=== 打印机设置

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

=== 内核和文件系统

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

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

[[l10n-compiling]]
== 编译I18N程序

许多FreeBSD Ports已经支持I18N了。他们中的一些都用-I18N作标记。 这些和其他很多程序已经内建I18N的支持，不需要考虑其他的事项了。 

然而一些像MySQL这样的应用程序需要重新配置字符集，可在 [.filename]##Makefile##里面设置，或者直接把参数传递给configure。 

[[lang-setup]]
== 本地化FreeBSD

[[ru-localize]]
=== 俄语（KOI8-R编码）

关于KOI8-R编码的更多信息请查阅link:http://koi8.pp.ru/[KOI8-R参考（Russian Net Character Set）]。 

==== 本地设置

把下面的行加入到您的[.filename]##~/.login_conf##文件：

[.programlisting]
....
me:My Account:\
	:charset=KOI8-R:\
	:lang=ru_RU.KOI8-R:
....

参看前面的设置<<setting-locale,本地化>>的例子。

==== 控制台设置

* 把下面一行加到 [.filename]#/etc/rc.conf#：
+
[.programlisting]
....
mousechar_start=3
....

* 并在 [.filename]#/etc/rc.conf# 里面增加如下设置：
+
[.programlisting]
....
keymap="ru.utf-8"
scrnmap="utf-82cp866"
font8x16="cp866b-8x16"
font8x14="cp866-8x14"
font8x8="cp866-8x8"
....

* 对于[.filename]##/etc/ttys##里面的``ttyv*``记录，要使用 ``cons25r``作为终端类型。

参看前面的设置<<setting-console,控制台>>的例子。

==== 打印机设置

既然绝大多数带俄语字符的打印机遵循CP866的标准， 那么需要一个针对KOI8-R到CP866转换的特定输出过滤器。这样的一个过滤器默认的安装在 [.filename]#/usr/libexec/lpr/ru/koi2alt#。 一个支持俄语的打印机的[.filename]##/etc/printcap##记录看起来是这样的： 

[.programlisting]
....
lp|Russian local line printer:\
	:sh:of=/usr/libexec/lpr/ru/koi2alt:\
	:lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:
....

更多信息参考man:printcap[5]手册页。

==== MS-DOS(R)文件系统和俄语文件名

下面的例子是在挂上MS-DOS(R) 文件系统后，启用对俄语文件名支持的man:fstab[5]记录： 

[.programlisting]
....
/dev/ad0s2      /dos/c  msdos   rw,-Wkoi2dos,-Lru_RU.KOI8-R 0 0
....

选项 `-L` 用于选择地区名称， 而 `-W` 则用于设置字符转换表。 要使用 `-W` 选项， 则一定要首先挂接 [.filename]#/usr#， 然后再挂接 MS-DOS(R) 分区， 因为转换表是放在 [.filename]#/usr/libdata/msdosfs# 的。 要了解进一步的细节， 请参考 man:mount_msdosfs[8] 联机手册。

==== X11设置

. 首先请进行前面介绍的 <<setting-locale,非-X 的本地化设置>>。
. 如果您正使用 Xorg， 请安装 package:x11-fonts/xorg-fonts-cyrillic[] package。
+ 
检查您 [.filename]#/etc/X11/xorg.conf# 文件中的 `"Files"` 小节。 下面的行， 应加到任何其它 `FontPath` 项之前：
+
[.programlisting]
....
FontPath   "/usr/local/lib/X11/fonts/cyrillic"
....
+
[NOTE]
====
请查看 ports 中的其它西里尔字体。
====

. 要激活俄语键盘， 需要在 [.filename]#xorg.conf# 文件的 `"Keyboard"` 小节中加入下列内容：
+
[.programlisting]
....
Option "XkbLayout"   "us,ru"
Option "XkbOptions"  "grp:toggle"
....
+ 
要确信``XkbDisable`` 已经关闭 (注释掉) 了。
+ 
RUS/LAT的切换用kbd:[CapsLock]。老的kbd:[CapsLock]功能可以通过 kbd:[Shift+CapsLock] 来模拟（只有在LAT模式的时候）。
+ 
使用 `grp:toggle` 时， RUS/LAT 切换键将是 kbd:[右 Alt]， 而使用 `grp:ctrl_shift_toggle` 则表示切换键是 kbd:[Ctrl+Shift]。 使用 `grp:caps_toggle` 时， RUS/LAT 切换键则是 kbd:[CapsLock]。 旧的 kbd:[CapsLock] 功能仍可通过 kbd:[Shift+CapsLock] (只对 LAT 模式有效)。 由于不明原因， `grp:caps_toggle` 在 Xorg 中无法使用。
+ 
如果您的键盘上有 "Windows(R)" 键， 但发现 RUS 模式下， 某些非字母键映射不正常， 则应在您的 [.filename]#xorg.conf# 文件中加入下面这行：
+
[.programlisting]
....
Option "XkbVariant" ",winkeys"
....

+
[NOTE]
====
俄语的 XKB 键盘可能并不为某些不具备本地化功能的应用程序所支持。
====

[NOTE]
====
本地化程序最低限度应在程序启动时调用 `XtSetLanguageProc (NULL, NULL, NULL);` 函数。

参见 http://koi8.pp.ru/xwin.html[KOI8-R for X Window] 以获得关于对 X11 应用进行本地化的指导。
====

=== 设置繁体中文

FreeBSD-Taiwan计划有一个使用很多中文ports的中文化指南在 http://netlab.cse.yzu.edu.tw/\~statue/freebsd/zh-tut/[http://netlab.cse.yzu.edu.tw/~statue/freebsd/zh-tut/]。 目前， `FreeBSD 中文化指南` 的维护人员是 沈俊兴 mailto:statue@freebsd.sinica.edu.tw[statue@freebsd.sinica.edu.tw]。 

沈俊兴 mailto:statue@freebsd.sinica.edu.tw[statue@freebsd.sinica.edu.tw] 利用 FreeBSD-Taiwan 的 ``zh-L10N-tut``建立了 http://netlab.cse.yzu.edu.tw/\~statue/cfc/[ Chinese FreeBSD Collection (CFC)]。 相关的 packages 和脚本等可以在 link:ftp://freebsd.csie.nctu.edu.tw/pub/taiwan/CFC/[ftp://freebsd.csie.nctu.edu.tw/pub/taiwan/CFC/] 找到。

=== 德语本地化（适合所有的ISO 8859-1语言）

Slaven Rezic mailto:eserte@cs.tu-berlin.de[eserte@cs.tu-berlin.de] 写了一个在 FreeBSD 机器下如何使用日尔曼语言的德语指南。 这份德语教程可以在 http://user.cs.tu-berlin.de/\~eserte/FreeBSD/doc/umlaute/umlaute.html[http://user.cs.tu-berlin.de/~eserte/FreeBSD/doc/umlaute/umlaute.html] 找到。

=== 希腊语本地化

Nikos Kokkalis mailto:nickkokkalis@gmail.com[nickkokkalis@gmail.com] 撰写了关于在 FreeBSD 上支持希腊语的完整文章， 在 https://www.FreeBSD.org/doc/el/articles/greek-language-support/[http://www.freebsd.org/doc/el/articles/greek-language-support/]。 请注意这篇文章 _只有_ 希腊语的版本。

=== 日语和韩语本地化

日语本地化请参考link:http://www.jp.FreeBSD.org/[http://www.jp.FreeBSD.org/]，韩语参考 http://www.kr.FreeBSD.org/[http://www.kr.FreeBSD.org/]。

=== 非英语的FreeBSD文档

一些 FreeBSD 的贡献者已经将部分 FreeBSD 文档翻译成了其他语言。 您可在 link:https://www.FreeBSD.org/[主站] 以及 [.filename]#/usr/shared/doc# 找到。
