Andrey A. Chernov Contributed by Michael C. Wu Rewritten by 本地化-I18N/L10N使用和设置 概述 FreeBSD是一个由分布于全世界的用户和贡献者支持的项目。 这章将讨论FreeBSD的国际化和本地化的问题,允许非英语用户也能使用FreeBSD很好地工作。 在系统和应用水平上,主要是通过执行i18N标准来实现的,所以这里我们将为读者提供详细的介绍。 读完这一章,您将了解到: 不同的语言和地域是如何在现代操作系统上进行编码的。 如何为您的登入shell设置本地化。 如何配置您的控制台为非英语语言。 languages. 如何使用不同的语言来有效地使用X Windows。 在哪里可以找到更多有关开发符合i18N标准的应用程序的信息。 阅读这章之前,您应当了解: 怎样安装额外的第三方程序()。 基础知识 I18N/L10N 是什么? 国际化 本地化 本地化 开发人员把internationalization简写成I18N,中间的数字是前后两个字母间的字母个数。 L10N依据localization 使用同样的命名规则。 I18N/L10N方法、协议和应用结合在一起,允许用户使用他们自己所选择的语言。 I18N应用程序使用I18N工具来编程。它允许开发人员写一个简单的文件, 就可以将显示的菜单和文本翻译成本地语言。我们非常鼓励程序员遵循这种规则。 为什么要使用I18N/L10N? I18N/L10N标准能够很好地支持您查看、输入或处理非英语语言。 I18N支持哪些语言? I18N和L10N不是FreeBSD特有的。当前,它能支持世界上绝大部分主力语言, 包括但不限于:中文,德文,日文,朝鲜文,法文,俄文,越南文等等。 使用本地化语言 I18N不是FreeBSD特有的,它是一个规则。我们鼓励您帮助FreeBSD完善这一规则。 locale 本地化设置需要具备三个条件:语言代码 (Language Code)、 国家代码 (Country Code) 和编码(Encoding)。 本地名字可以用下面这些部分来构造: 语言代码_国家代码.编码 语言和国家代码 语言代码 国家代码 为了用特殊的语言来对FreeBSD系统进行本地化(或其他类&unix;系统), 用户必须要知道相应的国家和语言代码(国家代码告诉应用程序使用哪一种语言规范)。 此外,WEB浏览器,SMTP/POP服务器,web服务器等都是以这个为基础的。下面就是一个国家和语言代码的例子: 语言/国家代码 描述 en_US 美国英语 ru_RU 俄语 zh_CN 简体中文 编码 编码 ASCII 一些语言不使用 ASCII 编码,它们使用8-位, 宽或多字节的字符, 更多的信息请参考 &man.multibyte.3;。 比较老的应用程序可能会无法识别它们, 并误认为是控制字符。 比较新的应用程序通常会认出 8-位字符。 随实现的不同, 用户可能不得不将宽或多字节字符支持编入应用程序, 或进行一些额外的配置, 才能够正常使用它们。 要输入和处理宽或多字节字符, FreeBSD Ports Collection 已经为每种语言提供了不同的程序。 请参考各个 FreeBSD Port 中的 I18N 文档。 特别需要指出的是, 用户可能需要查看应用程序的文档, 以确定如何正确地配置它, 或需要为 configure/Makefile/编译器 指定什么样的参数。 记住下面这些: 特定语言的简单C字符集(参考&man.multibyte.3;),以及ISO-8859-1, ISO-8859-15, KOI8-R, CP437. 宽字节或多字节编码,如EUC, Big5。 您可以在IANA Registry检查一下现行的字符集列表。 FreeBSD 4.5及以后的版本使用X11兼容的本地编码来代替。 I18N应用程序 在FreeBSD Ports和Package系统里面,I18N应用程序已经使用I18N 来命名。然而它们不是总支持需要的语言。 本地化设置 通常只要在登入shell里面设置LANG为本地化, 一般通过设置用户的 ~/.login_conf 或用户shell的启动文件(~/.profile~/.bashrc, ~/.cshrc)。没有必要设置 LC_CTYPELC_CTIME。 更多的信息请参考特定语言的FreeBSD文档。 您应当在您的配置文件中设置下面两个变量: POSIX LANG 为&posix;设置本地化语言功能。 MIME MM_CHARSET应用程序的MIME字符集。 这包括用户的shell配置,特定的应用配置和X11配置。 设置本地化的方法 本地化 登入分类 有两种方法来设置本地化,接下来都会描述。 第一种 (推荐) 就是在 登入分类里面指定环境变量。 第二种方法是把环境变量加到shell的启动文件里面。 登入分类方法 这种方法允许把本地化名称和MIME字符集的环境变量赋给可能的shell, 而不是加到每个特定shell的启动文件里面。 用户级设置 Level Setup 允许普通用户自己完成这个设置,而管理员级设置需要超级用户权限。 用户级设置 这有一个设置用户根目录文件.login_conf的小例子, 它为上述两个变量设置了Latin-1编码。 me:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1: 繁体中文BIG-5编码 这是一个为.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:\ :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 更多的信息参考管理员级设置和&man.login.conf.5; 管理员级设置 检查用户的登入分类在 /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.ISO8859-1:\ :tc=default: 使用&man.vipw.8;改变登入类型。 vipw 使用vipw添加新用户,看起来像下面这样: user:password:1111:11:language:0:0:User Name:/home/user:/bin/sh 用&man.adduser.8;改变登入类型。 adduser 登入分类 adduser添加新用户看起来像下面这样: /etc/adduser.conf里面设置defaultclass = 语言。应该记住,您必须为使用其它语言的所有用户设置 缺省类别。 每一次使用&man.adduser.8;的时候,一个特定语言的可选择性回答会像下面这样给出: Enter login class: default []: 如果您打算给每一个用户使用另外一种语言,您应该这样: &prompt.root; adduser -class language 使用&man.pw.8;改变登入类型。 pw 如果您使用&man.pw.8;来添加新用户,应该这样使用: &prompt.root; pw useradd user_name -L language Shell启动文件方法 不推荐使用这种方法,因为它需要给每一个可能的shell程序一个不同的启动文件。 应该用登入分类方法来代替这种方法。 MIME locale 为了设置本地化名称和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(看上面)。 控制台设置 对于所有的简单C字符集,在/etc/rc.conf中用正在讨论的语言设置正确的控制台字符: font8x16=font_name font8x14=font_name font8x8=font_name 这儿的font_name来自于/usr/share/syscons/fonts目录, 不带.fnt后缀。 sysinstall keymap screenmap 您还需要确定正确地为您的 C 字符集配置了 keymap 和 screenmap, 这一工作可以通过 sysinstall (在 &os; 5.2 之前的版本是 /stand/sysinstall) 来完成。。 进入 sysinstall 之后, 选择 ConfigureConsole。 此外, 您也可以将下面的设置加入 /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" 那么需要在下一段检查鼠标指针信息。 moused 默认情况下, &man.syscons.4;驱动程序的鼠标指针在字符集中占用0xd0-0xd3的范围。 如果您的语言使用这个范围,您必须把指针范围移出这个范围。 要在5.0以前的FreeBSD版本中启用工作区,需要在您的内核中添加下面这行: options SC_MOUSE_CHAR=0x03 对于 FreeBSD 4.4 和以后的版本, 需要在 /etc/rc.conf 中加入: mousechar_start=3 这里, keymap_name 来自于 /usr/share/syscons/keymaps 目录, 但去掉了 .kbd 后缀。 如果不确定应该使用哪一个键盘布局, 则可以使用 &man.kbdmap.1; 来测试, 而无需反复重启。 通常, keychange 是设定功能键时, 匹配选定的终端类型来说是必需的, 因为功能键序列无法在键盘布局中定义。 此外您还应该检查并确认在 /etc/ttys 中已经为所有的 ttyv* 项配置了正确的终端类型。 目前, 相关的默认定义是: 字符集设置 终端类型 ISO-8859-1 or ISO-8859-15 cons25l1 ISO-8859-2 cons25l2 ISO-8859-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 X11设置 虽然X11不是FreeBSD计划的一部分, 但我们已经为FreeBSD用户包含了一些信息。 具体细节可以参考&xorg; Web 站点 或是您使用的 X11 Server 的网站。 ~/.Xresources里面,您可以适当调整特定应用程序的I18N设置(如字体,菜单等)。 显示字体 X11 True Type 字体服务器 安装 &xorg; 服务器 (x11-servers/xorg-server) 或 &xfree86; 服务器 (x11-servers/XFree86-4-Server), 然后安装对应语言的 &truetype; 字体。 请设置正确的地区信息, 这将让您能够在菜单和其它地方看到所选择的语言。 输入非英语字符 X11输入方法(XIM) X11输入方法(XIM)协议是所有X11客户端的一个新标准。 所有将作为XIM客户端来写的X11应用程序从XIM输入服务器输入。 不同的语言有几种XIM服务器可用。 打印机设置 一些简单的C字符集通常是用硬编码来编码进打印机的。更宽或多位的字符集需要特定的设置, 我们推荐使用apsfilter。您也可以使用特定语言转换器把文档转换为 &postscript;或PDF格式。 内核和文件系统 FreeBSD 的快速文件系统 (FFS) 是完全支持 8-位 字符的, 因此它可以被用于任何简单的 C 字符集 (参见 &man.multibyte.3;), 但在文件系统中不会保存字符集的名字; 也就是说, 它不加修改地保存 8-位信息, 而并不知道如何编码。 正式说来, FFS 目前还不支持任何形式的宽或多字节字符集。 不过, 某些宽或多字符集提供了独立的针对 FFS 的补丁来帮助启用关于它们的支持。 目前这些要么是无法移植的, 要么过于粗糙, 因此我们不打算把它们加入到源代码中。 请参考相关语言的 Web 站点, 以了解关于这些补丁的进一步情况。 DOS Unicode FreeBSD &ms-dos;已经能够配置成用在&ms-dos;上,Unicode字符集和可选的FreeBSD文件系统字符集的更多信息, 请参考&man.mount.msdos.8;手册页。 编译I18N程序 许多FreeBSD Ports已经支持I18N了。他们中的一些都用-I18N作标记。 这些和其他很多程序已经内建I18N的支持,不需要考虑其他的事项了。 MySQL 然而一些像MySQL这样的应用程序需要重新配置字符集,可在 Makefile里面设置,或者直接把参数传递给configure 本地化FreeBSD Andrey A. Chernov Originally contributed by 俄语(KOI8-R编码) 本地化 俄语 关于KOI8-R编码的更多信息请查阅KOI8-R参考(Russian Net Character Set) 本地设置 把下面的行加入到您的~/.login_conf文件: me:My Account:\ :charset=KOI8-R:\ :lang=ru_RU.KOI8-R: 参看前面的设置本地化的例子。 控制台设置 对于FreeBSD 5.0以前的版本,添加下面这行到内核配置文件: options SC_MOUSE_CHAR=0x03 对于 FreeBSD 4.4 和更高版本把下面一行加到 /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: 更多信息参考&man.printcap.5;手册页。 &ms-dos;文件系统和俄语文件名 下面的例子是在挂上&ms-dos; 文件系统后,启用对俄语文件名支持的&man.fstab.5;记录: /dev/ad0s2 /dos/c msdos rw,-Wkoi2dos,-Lru_RU.KOI8-R 0 0 选项 用于选择地区名称, 而 则用于设置字符转换表。 要使用 选项, 则一定要首先挂接 /usr, 然后再挂接 &ms-dos; 分区, 因为转换表是放在 /usr/libdata/msdosfs 的。 要了解进一步的细节, 请参考 &man.mount.msdos.8; 联机手册。 X11设置 先描述没有X的本地化设置 俄语 KOI8-R 地区代码可能无法在旧的 &xfree86; 版本 (低于 3.3) 上正常工作。 目前, &xorg; 是 FreeBSD 上默认的 X Window System 系统版本。 因此支持这些地区代码没有任何问题, 除非您使用很旧的 FreeBSD 版本。 进入russian/X.language目录,然后执行如下的命令: &prompt.root; make install 上述 port 将安装最新版本的 KOI8-R 字体。 &xorg; (也包括 &xfree86; 的 3.3 和更高版本) 已经包括了一些 KOI8-R 字体, 但上述 port 中的版本能够更好地适应缩放。 请检查您的 /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行。 为了激活俄语"键盘",加下面几行到XF86Config文件里面: 对于&xfree86; 3.X: XkbLayout "ru" XkbOptions "grp:caps_toggle" 对于 &xorg; (或 &xfree86; 4.X): Option "XkbLayout" "ru" Option "XkbOptions" "grp:caps_toggle" 要确信XkbDisable 已经关闭(注释掉)了。 RUS/LAT的切换用CapsLock。老的CapsLock功能可以通过 ShiftCapsLock 来模拟(只有在LAT模式的时候)。 如果您的键盘上有&windows;键, 注意在俄语模式中,一些非字母顺序的键会影射错误,可以在XF86Config文件中添加下面这行: 对于&xfree86; 3.X: XkbVariant "winkeys" 对于 &xorg; (或 &xfree86; 4.X): Option "XkbVariant" "winkeys" 俄语的XKB键盘可能不能在老版本的&xfree86;下工作, 更多的信息参考上面的注释。俄语XKB键盘也不能很好的工作在 非本地化应用程序下面。早期的非本地化应用程序最低限度应该调用XtSetLanguageProc (NULL, NULL, NULL);。更多的本地化X11应用程序的信息请参考 KOI8-R for X Window 设置繁体中文 本地化 繁体中文 FreeBSD-Taiwan计划有一个使用很多中文ports的中文化指南在 。 目前, FreeBSD 中文化指南 的维护人员是 沈俊兴 statue@freebsd.sinica.edu.tw 沈俊兴 statue@freebsd.sinica.edu.tw 利用 FreeBSD-Taiwan 的 zh-L10N-tut建立了 Chinese FreeBSD Collection (CFC)。 相关的 packages 和脚本等可以在 找到。 德语本地化(适合所有的ISO 8859-1语言) 本地化 德语 Slaven Rezic eserte at cs.tu-berlin.de 写了一个在FreeBSD机器下如何使用日尔曼语言的德语指南。 可以在下找到。 日语和韩语本地化 本地化 日语 本地化 韩语 日语本地化请参考,韩语参考 非英语的FreeBSD文档 一些FreeBSD的贡献者已经将部分FreeBSD文档翻译成了其他语言。 可以通过主站 或者 /usr/share/doc 查到。