第13章 本地化- I18N/L10N的使用与设置
13.1概要
FreeBSD是一个由分布于全世界的用户和贡献者组成的项目。这章将讨论FreeBSD的国际化和本地化的问题,允许非英语用户也能使用FreeBSD很好地工作。在系统和应用水平上,主要是通过执行i18N标准来实现的,所以这里我们将为读者提供详细的介绍。
读完这章,你将了解到:
在现代操作系统中,不同的语言和地域是如何来编码的。
如何为你的登陆shell设置本地化。
如何用非英语语言来配置你的控制台。
如何使用不同的语言来有效地使用X window。
哪里可以找到更多有关开发符合i18N标准的应用程序的信息。
阅读这章之前,你应当了解:
如何安装第三方应用程序(第4章)。
13.2基础知识
13.2.1什么是I18N/L10N?
开发人员依据I18N标准缩短了国际化开发的进程,在国际化的第一和最后一个字母之间计算字母的数量。L10N依据“localization”使用同样的命名规则。I18N/L10N方法、协议和应用结合在一起,允许用户使用他们自己所选择的语言。I18N应用程序使用I18N工具来编程。它允许开发人员写一个简单的文件,就可以将显示的菜单和文本翻译成本地语言。我们非常鼓励程序员遵循这种规则。
13.2.2为什么要使用I18N/L10N?
I18N/L10N标准能够很好地支持你查看、输入或处理非英语语言。
13.2.3 I18N支持哪些语言?
I18N和L10N不是FreeBSD特有的。当前,它能支持世界上绝大部分主力语言,包括但不限于:中文,德文,日文,朝鲜文,法文,俄文,越南文等等。
13.3使用本地化语言
I18N不是FreeBSD特有的,它是一个规则。我们鼓励你帮助FreeBSD完善这一规则。本地化设置需要具备三个条件:语言代码(Language Code)、国家代码(Country Code)和编码(Encoding)。本地名字可以用下面这些部分来构造:
LanguageCode_CountryCode.Encoding
13.3.1语言和国家代码
为了用特殊的语言来对FreeBSD系统进行本地化(或其他支持I18N的UNIX),用户必须要知道相应的国家和语言代码(国家代码告诉应用程序使用哪一种语言规范)。另外WEB浏览器,SMTP/POP服务器,web服务器等等都是以这个为基础的。下面就是一个国家和语言代码的例子:
语言/国家代码 |
描述 |
en_US |
美国英语 |
ru_RU |
俄语 |
zh_TW |
繁体中文 |
13.3.2编码
一些语言不使用ASCII编码,它们使用8位,更宽或多位的字符,可以看看multibyte的联机手册了解更多细节。比较老的应用程序可能会无法认出它们,把它们误认为是控制字符。比较新的应用程序通常会认出8位字符。根据执行情况,用户可能需要使用更宽或多位字符支持的标准来重新编译这个应用程序,或者将它正确配置。为了能够输入或处理更宽或多位字符,FreeBSD Ports collection已经为每一个语言提供了相应的程序。可以在各自的FreeBSD port中参考一下I18N的文档。
需要特别指出的:用户需要看看应用程序的文档以决定如何正确配置,或需要使用正确的值来配置/Makefile/compiler。
记住下面这些:
特定语言的简单C字符集,如,ISO_8859-1,ISO_8859-15,KOI8-R,CP437。
更宽或多位编码,如,EUC,Big5。
你可以在The IANA Registry(ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets)检查一下现行的字符集列表。
注意:FreeBSD 5.0版本以后使用X11兼容的本地编码来代替。
13.3.3 I18N应用
在FreeBSD的Port和Package系统中,I18N应用程序已经使用I18N来命名了。然而,它们不是总支持所需要的语言。
13.3.4设置本地化
理论上,在登陆shell中,只需要输出他/她的本地名字的值作为LANG,通常是通过用户的~/.login_conf文件或用户登陆shell的配置(~/.profile,~/.bashrc,~/.cshrc)来完成的。这需要设置所有的本地子集(例如LC_CTYPE, LC_CTIME等)。请参考特定语言的FreeBSD文档以了解更多信息。
你应当在你的配置文件中设置下面两个值:
LANG
为POSIX设置本地化语言功能
MM_CHARSET应用程序的MIME字符集
这包括用户的shell配置,特定的应用配置和X11配置。
设置本地化的方法
有两种方法来设置本地化,下面都会描述到。第一种是在login class中分配环境变量,第二种是增加环境变量,分派到系统shell的启动文件中。
登陆的分类方法
这个方法是允许本地名字和MIME字符集设置所需要的环境变量为每一个可能的shell重新分配一次,以代替给每一个shell启动文件添加指定的shell分配。用户级水平的设置可以由用户自己来做,管理员级的设置需要由超级用户来做。
用户级水平的设置
这是在用户主目录中的一个.login_conf文件的例子,它已为Latin-1编码作了变量设置:
german:German
User:\
:charset=ISO-8859-1:\
:lang=de_DE.ISO_8859-1:
注意:de_DE.ISO8859-1主要用于FreeBSD 5.0和以上版本。
下面是一个为繁体中文BIG5编码设置变量的.login_conf的例子。需要注意很多变量设置,因为一些软件不能支持针对中文、日文和朝鲜文的本地化变量规则。
#Users who
do not wish to use monetary units or time formats
#of Taiwan
can manually change each variable
taiwan:Taiwanese
User:\
lang=zh_TW.Big5:\
lc_all=zh_TW.Big:\
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=xcin":
#Setting the XIM Input Server
可以看看下一节和login.conf的联机手册了解更多细节。
管理员级设置
检查/etc/login.conf中正确语言用户的种类。确信这些设置出现在/etc/login.conf中:
language_name:
accounts_title:\
:charset=
MIME_charset:\
:lang=
locale_name:\
:tc=default:
看看我们前面使用Latin-1的例子,它看起来像这样:
german:German
Users Accounts:\
:charset=ISO-8859-1:\
:lang=de_DE.ISO_8859-1:\
:tc=default:
使用vipw改变登陆类型
使用vipw增加新用户,然后做一个这样的记录:
user:password:1111:11:
language:0:0:User Name:/home/user:/bin/sh
使用adduser改变登陆类型
使用adduser增加新的用户,然后这样做:
在/etc/adduser.conf 中设置defaultclass = language。在这个例子中,记住你必须为所有其他语言的用户键入一个默认的类。
另一个不同的方法是每次回答指定的语言
Enter login class: default []:
还有就是为你希望添加不同语言的每个用户使用下面这个命令:
adduser -class language
使用pw改变登陆类型。
如果你使用pw来增加新的用户,以这种形式呼叫:
# pw useradd user_name -L language
Shell启动文件的方法
注意:这个方法并不建议使用,因为它要求为每个可能的登陆程序选择一个不同的安装。应当使用登陆类的方法(在这章的前面讲到)。
要增加本地名字和MIME字符集,只要在/etc/profile或/etc/csh.login shell启动文件中设置两个环境变量。我们使用德语作为例子:
在/etc/profile中:
LANG=de_DE.ISO_8859-1; export LANG
MM_CHARSET=ISO-8859-1; export MM_CHARSET
或在/etc/csh.login中:
setenv LANG de_DE.ISO_8859-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.ISO_8859-1; export LANG
或:
setenv LANG de_DE.ISO_8859-1
依赖于你的shell(看看上面的章节)。
13.3.5控制台设置
对于所有的简单C字符集,在/etc/rc.conf中用正在讨论的语言设置正确的控制台字符:
font8x16=font_name
font8x14=font_name
font8x8=font_name
这儿的font_name来自/usr/share/syscons/fonts目录,不带.fnt后缀。也可以通过使用/stand/sysinstall程序为你的简单C字符集设置正确的键盘布局和屏幕布局。进入sysinstall,选择configue,然后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驱动程序的鼠标指针在字符集中占用0xd0-0xd3的范围。如果你的语言使用这个范围,你必须把指针范围移出这个范围。要在5.0以前的FreeBSD版本中启用工作区,需要在你的内核中添加下面这行:
options
SC_MOUSE_CHAR=0x03
对于FreeBSD
5.0和以后的版本,需要在/etc/rc.conf文件中添加下面这行:
mousechar_start=3
这儿的keymap_name来自/usr/share/syscons/keymaps目录,没有带.kbd后缀。
因为功能键的范围不能被定义在键盘地图中,所以keychange通常需要安排功能键来匹配选择的终端类型。也可以在/etc/ttys中为所有ttyv*记录设定正确的控制台终端类型。当前,预定义是这样的:
字符设置 |
终端类型 |
ISO-8859-1或ISO-8859-15 |
cons25l1 |
ISO-8859-2 |
cons25l2 |
KOI8-R |
cons25r |
KOI8-U |
cons25u |
CP437
(hardware default)或 US-ASCII |
cons25 |
对于多字节字符语言,可以你的在/usr/ports/language目录中使用正确的FreeBSD port。一些port以控制台出现,而系统把它作为串行vtty终端,因此,你必须为X11和伪串行控制台准备足够的vtty终端。这儿是在控制台中使用其他语言的应用程序的部分列表:
语言 |
定位 |
Traditional
Chinese (BIG-5) |
chinese/big5con |
Japanese |
japanese/ja-kon2-*
或japanese/Mule_Wnn |
Korean |
korean/ko-han |
13.3.6 X11设置
虽然X11不是FreeBSD计划的一部分,但我们已经为FreeBSD用户包含了一些信息。具体细节,可以参考XFree86的web站点或是你使用的无论哪个X server。在~/.Xresources中,你可以适当调整特定应用的I18N设置(如:字体,菜单等)。
显示字体
安装X11 True Type-Common服务器和安装对应语言的truetype字体。设置正确的本地信息可以允许你在菜单上看到你所选的语言。
输入非英语字符
X11输入方法(XIM)协议是所有X11客户端的一个新标准。所有将作为XIM客户端来写的X11应用程序从XIM输入服务器输入。不同的语言有几种XIM服务器可用。
13.3.7打印机设置
一些简单的C字符集通常是用硬编码来编码进打印机的。更宽或多位的字符集需要特定的设置,我们建议使用apsfilter。你也可以使用特定语言的转换器把文档转换成Postscript或PDF格式。
13.3.8内核和文件系统
FreeBSD FFS文件系统是纯8位的,所以它能用任何简单的C字符集,但不会有字符集名字会储存在文件系统中。它是不知道任何有关编码规则的。FFS不支持任何更宽或多位字符设置形式的。正式的,FFS不支持任何更宽的或多位的字符集形式。然而一些更宽的或多位的字符集已经通过添加补丁来对FFS进行支持。他们只是临时性的修正,我们决定不把他们包括在源代码树中。可以参考相关语言的web站点看看更多信息和修正文件。
FreeBSD的MS-DOS文件系统已经能够配置成功用来在MSDOS,统一字符编码和FreeBSD文件系统字符集之间互相转换。可以看看mount_msdos的联机手册了解更多细节。
13.4编译I18N程序
许多FreeBSD Port已经支持I18N了。他们中的一些都用-I18N作标记。这些和其他很多程序已经内建I18N的支持,不需要考虑其他的事项了。
然而一些像MySQL这样的程序需要用特殊的字符重新配置。这通常可以在makefile或在源代码中通过一个值来设定。
13.5将FreeBSD本地化
13.5.1俄语(KOI8-R编码)
有关KOI8-R编码的详细信息,请查看KOI8-R参考KOI8-R
References (Russian Net Character Set)(http://koi8.pp.ru)。
本地设置
把下面的行加入到你的~/.login_conf文件:
me:My Account:\
:charset=KOI8-R:\
:lang=ru_RU.KOI8-R:
控制台设置
对于FreeBSD 5.0以前的版本,添加下面这行到内核配置文件:
options
SC_MOUSE_CHAR=0x03
对于FreeBSD
5.0和以后的版本,添加下面这行到/etc/rc.conf文件:
mousechar_start=3
在/etc/rc.conf中使用下面的设置:
keymap=“ru.koi8-r”
scrnmap=“koi8-r2cp866”
font8x16=“cp866b-8x16”
font8x14=“cp866-8x14”
font8x8=“cp866-8x8”
对于在/etc/ttys中每个ttyv*记录,要使用cons25r作为终端类型。
看看这章的前面部分设置控制台的例子。
打印机设置
既然绝大多数带俄语字符的打印机遵循CP866的标准,那么需要一个针对KOI8-R--> CP866转换的特定输出过滤器。这样一个过滤器默认的安装在/usr/libexec/lpr/ru/koi2alt中。一个支持俄语的打印机/etc/printcap记录是这样的:
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:
MS-DOS文件系统和俄语文件名
下面的例子是在挂上MSDOS文件系统后,fstab记录启用对俄语文件名的支持:
/dev/ad0s2 /dos/c msdos rw,-W=koi2dos,-L=ru_RU.KOI8-R
0 0
X11设置
1. 先描述没有X的本地设置
注意: Russian KOI8-R本地化方法可能在低于3.3的XFree86版本中不能工作。从/x11/XFree86安装XFree86
port是最新的版本,所以如果你从port安装XFree86,它就会很好地工作。除非你使用一个老版本的FreeBSD,否则这是没有问题的。
2. 进入russian/X.language目录,执行下面的命令:
# make install
上面的port安装了KOI8-R字体的最新版本。XFree86 3.3已经支持了一些KOI8-R字体,但这些更好。
在你的/etc/XF86Config文件中检查“Files”那节。需要在其他fontpath记录前加入下面这几行:
FontPath “/usr/X11R6/lib/X11/fonts/cyrillic/misc”
FontPath “/usr/X11R6/lib/X11/fonts/cyrillic/75dpi”
FontPath “/usr/X11R6/lib/X11/fonts/cyrillic/100dpi”
如果你使用一个高分辨率的显示模式,可以交换75 dpi 和100 dpi行。
3. 要激活俄语键盘,添加下面的几行到XF86Config配置文件中的“Keyboard”部分。
对于XFree86 v3.*:
XkbLayout “ru”
XkbOptions “grp:caps_toggle”
对于XFree86
v4.*:
Option “XkbLayout” “ru”
Option “XkbOptions” “grp:caps_toggle”
要确信XkbDisable已经关闭(注释)了。RUS/LAT的切换用CapsLock键,老的CapsLock功能仍然可以使用Shift+CapsLock(只在LAT模式)来完成。
如果你的键盘有“Windows”键,注意在俄语模式中,一些非字母顺序的键会影射错误,可以在XF86Config文件中添加下面这行:
对于XFree86
v3.*:
XkbVariant “winkeys”
对于XFree86
v4.*:
Option “XkbVariant” “winkeys”
注意:俄语的XKB键盘无法用在老的XFree86版本中。俄语XKB键盘也不能用在非本地化应用程序上。最低程度的本地化应用程序应当呼叫一个XtSetLanguageProc (NULL, NULL, NULL)早期的功能。看看KOI8-R的有关本地化X11应用程序的用法。
13.5.2设置繁体中文
FreeBSD-Taiwan计划有一个使用很多中文chinese/*应用程序的FreeBSD I18N/L10N的教程。(http://freebsd.sinica.edu.tw/~ncvs/zh-l10n-tut/index.html)。zh-l10n-tut的编辑是Clive Lin<Clive@CirX.org>,你也可以在freebsd.sinica.edu.tw cvsup下面的软件收集。
软件包 |
描述 |
outta-port
tag=. |
针对中文的Beta版Ports Collection |
zh-L10N-tut
tag=. |
用Big5编码的繁体中文FreeBSD本地化指南 |
zh-doc
tag=. |
FreeBSD的Big5繁体中文文档翻译计划 |
Chuan-Hsing
Shen<s874070@mail.yzu.edu.tw>已经使用FreeBSD-Taiwan的zh-L10N-tut创建了Chinese
FreeBSD Collection (CFC)。这些软件包和脚本文件可以在ftp://ftp.csie.ncu.edu.tw/OS/FreeBSD/taiwan/CFC/找到。
13.5.3 德语的本地化 (针对所有的ISO 8859-1语言)
Slaven
Rezic <eserte@cs.tu-berlin.de>写了一个在FreeBSD机器上如何使用日耳曼语言的教程。这篇教程是用德语写的,可以在下面这个网站(http://www.de.FreeBSD/de/umlaute/)找到。
13.5.4日语和朝鲜语的本地化
对于日语,可以参考http://www.jp.FreeBSD.org,对于朝鲜语,可以参考http://www.kr.FreeBSD.org。
13.5.5非英语的FreeBSD文档
一些FreeBSD的贡献者已经将部分FreeBSD文档翻译成了其他语言。可以通过主站的链接或/usr/share/doc目录查到相应的文档。