25.2.使用本地化 =============== 本地化设置主要基于三个部分:语言代码、国家代码(地区)和编码。本地化名称是由这些部分构成的,如下所示: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 语言代码_国家代码(地区).编码 语言代码和国家代码用于确定国家(地区)和具体的语言变化。通用语言和国家(地区)代码提供了一些语言代码_国家(地区)代码的例子。 **表 15. 常见的语言和国家(地区)代码** ========================= ================== 语言代码_国家(地区)代码 代指 ========================= ================== en_US 英语,美国 ru_RU 俄语,俄罗斯 zh_TW 繁体中文,中国台湾 ========================= ================== 完整的可用语言列表可以通过输入以下内容找到: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % locale -a | more 要确定当前的地区设置。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % locale 特定语言的字符集,如 ISO8859-1、ISO8859-15、KOI8-R 和 CP437,在 `multibyte(3) `__ 中有说明。可以在 `IANA 注册中心 `__\ 找到有效的字符集列表。 有些语言,如中文或日文,不能用 ASCII 字符表示,需要用宽字符或多字节字符进行扩展语言编码。宽字符或多字节编码的例子包括 EUC 和 Big5。老的应用程序可能会误认为这些编码是控制字符,而新的应用程序通常会识别这些字符。根据具体实现,用户可能需要编译软件以支持宽字符或多字节字符,或者对其进行正确的配置。 **注意** FreeBSD 使用与 Xorg 兼容的地区编码。 本节的其余部分将说明在 FreeBSD 系统上配置 locale 的各种方法。下一节将讨论寻找和编译支持 i18n 的应用程序的注意事项。 25.2.1.为登录 shell 设置地区设置 -------------------------------- 地区设置是在用户的 **~/.login_conf** 或用户 shell 的启动文件 **~/.profile**\ ,\ **~/.bashrc**\ ,或 **~/.cshrc** 中配置的。 有需要对两个环境变量进行设置: - ``LANG``\ ,用于设置语言环境 - ``MM_CHARSET``\ ,设置应用程序使用的 MIME 字符集 除了配置用户的 shell 之外,还应该为特定的应用程序配置和 Xorg 配置设置这些变量。 有两种方法可用于进行所需的变量分配:\ `登录分级 `__\ (推荐)和\ `启动文件 `__\ 。接下来的两节将演示如何使用这两种方法。 25.2.1.1.登录分级 ~~~~~~~~~~~~~~~~~ 这第一种是推荐的方法,因为它为每个可能的 shell 都分配了所需的环境变量,如本地化名称和 MIME 字符集。这个设置可以由每个用户执行,也可由超级用户为所有用户配置。 这个最简单的例子在单个用户的主目录的 **.login_conf** 中为 ``Latin-1`` 编码设置了两个变量: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session me:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1: 下面是一个用户 **~/.login_conf** 的例子,它为 BIG-5 编码的繁体中文设置了变量。因为有些应用程序不能正确地遵守中文、日文和韩文的地区变量,所以需要设置更多的变量: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session #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,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:\ 另外,超级用户可以对系统的所有用户进行本地化配置。在 **/etc/login.conf** 中的以下变量可用于设置 locale 和 MIME 字符集: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session language_name|Account Type Description:\ :charset=MIME_charset:\ :lang=locale_name:\ :tc=default: 因此,之前的 Latin-1 例子就会是这样的: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session german|German Users Accounts:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1:\ :tc=default: 关于这些变量的更多细节,见 `login.conf(5) `__\ 。注意,它已经包含了预先定义的 \*russian \* 分级。 每当编辑 **/etc/login.conf** 后,记得执行以下命令来更新数据库能力: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # cap_mkdb /etc/login.conf .. **注意** 对于终端用户来说,需要在他们的 **~/.login_conf** 上运行 ``cap_mkdb`` 命令,以使任何改变生效。 25.2.1.1.1.改变登录分级的实用程序 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 除了手动编辑 **/etc/login.conf** 之外,还有几个工具可以用来为新创建的用户设置 locale。 当使用 ``vipw`` 添加新用户时,指定 *language* 来设置 locale: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session user:password:1111:language:0:0:User Name:/home/user:/bin/sh 当使用 ``adduser`` 添加新用户时,可以为所有新用户预先配置默认语言,也可以为单个用户指定。 如果所有新用户都使用相同的语言,在 **/etc/adduser.conf**\ 中设置 ``defaultclass=`` *language*\ 。 要在创建用户时覆盖这个设置,可以在这个提示下输入所需的地区语言: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session Enter login class: default []: 或者在调用 ``adduser`` 时指定要设置的 locale: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # adduser -class language 如果使用 ``pw`` 来添加新的用户,请按以下方式指定 locale: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # pw useradd user_name -L language 要改变一个现有用户的登录分级,可以使用 ``chpass``\ 。以超级用户身份调用它,并提供要编辑的用户名作为参数: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # chpass user_name 25.2.1.2.shell 启动文件方法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 不推荐使用这种方法,因为每个使用的 shell 都需要进行手动配置,每个 shell 都有不同的配置文件和不同的语法。举个例子,为了给 ``sh`` 设置德语,可以在 **~/.profile** 中加入这些行,以设置仅适用于该用户的 shell。这些行也可以添加到 **/etc/profile** 或 **/usr/share/skel/dot.profile** 中,以便为所有用户都设置该 shell: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session LANG=de_DE.ISO8859-1; export LANG MM_CHARSET=ISO-8859-1; export MM_CHARSET 然而,对于 csh 来说,配置文件的名称和使用的语法是不同的。这些是以上设置的同等文件 **~/.login**\ 、\ **/etc/csh.login** 和 **/usr/share/skel/dot.login**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session setenv LANG de_DE.ISO8859-1 setenv MM_CHARSET ISO-8859-1 使问题复杂化的是,在 **~/.xinitrc** 中配置 Xorg 所需的语法也取决于 shell。第一个例子是针对 sh 的,第二个是针对 csh 的: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session LANG=de_DE.ISO8859-1; export LANG .. raw:: latex \diilbookstyleinputcell .. code:: shell-session setenv LANG de_DE.ISO8859-1 25.2.2.控制台设置 ----------------- 有几种本地化的字体可用于控制台。要查看可用字体的列表,请输入 ``ls /usr/share/syscons/fonts``\ 。要配置控制台字体,在 **/etc/rc.conf** 中指定 *font_name*\ ,不含 *.fnt* 后缀: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session font8x16=font_name font8x14=font_name font8x8=font_name 可以通过在 **/etc/rc.conf** 中添加以下内容来设置键盘映射和屏幕映射: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session 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) `__\ 。 由于不能在键盘映射中定义功能键序列,因此通常需要使用 ``keychange`` 条目来对功能键进行编程以匹配所选的终端类型。 接下来,在 **/etc/ttys** 中为所有虚拟终端条目设置正确的控制台终端类型。为\ `字符集定义的终端类型 `__\ 总结了可用的终端类型: **表 16. 为字符集定义的终端类型** ======================= ======== 字符集 终端类型 ======================= ======== 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 的\ `可用终端的 port `__ 中进行了总结。安装完毕后,请参考 port 的 **pkg-message** 或 man 页面以了解配置和使用说明。 表 17. 来自 ports 的可用控制台 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ================ =========================================================================================== 语言 port 位置 ================ =========================================================================================== 繁体中文 (BIG-5) `chinese/big5con `__ 中文/日语/韩语 `chinese/cce `__ 中文/日语/韩语 `chinese/zhcon `__ 日语 `chinese/kon2 `__ 日语 `japanese/kon2-14dot `__ 日语 `japanese/kon2-16dot `__ ================ =========================================================================================== 如果在 **/etc/rc.conf** 中启用了 moused,可能需要额外的配置。默认情况下,驱动 `syscons(4) `__ 的鼠标光标在字符集中占据范围 ``0xd0-0xd3``\ 。如果语言使用了这个范围,请在 **/etc/rc.conf** 中添加以下一行来移动光标的范围: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session mousechar_start=3 25.2.3.设置 Xorg ---------------- `X Window 系统 `__ 介绍了如何安装和配置 Xorg。在为本地化配置 Xorg 时,可以从 FreeBSD ports 中获得额外的字体和输入法。可以在 **~/.Xresources** 中调整应用程序特定的 i18n 设置,如字体和菜单,并可让用户在图形化的应用程序菜单中查看他们选择的语言。 X 输入法(XIM)协议是符合 Xorg 标准,用于输入非英语字符。\ `可用的输入法 `__ 总结了 FreeBSD ports 中可用的输入法应用程序。另外还有一些 Fcitx 和 Uim 应用。 表 4. 可用的输入法 ^^^^^^^^^^^^^^^^^^ ====== ========================================================================================================================= 语言 输入法 ====== ========================================================================================================================= 中文 `chinese/gcin `__ 中文 `chinese/ibus-chewing <../di-23-zhang-ben-di-hua-i18nl10n-de-shi-yong-he-she-zhi/chinese/gcin/>`__ 中文 `chinese/ibus-pinyin `__ 中文 `chinese/oxim `__ 中文 `chinese/scim-fcitx `__ 中文 `chinese/scim-pinyin `__ 中文 `chinese/scim-tables `__ 日语 `japanese/ibus-anthy `__ 日语 `japanese/ibus-mozc `__ 日语 `japanese/ibus-skk `__ 日语 `japanese/im-ja `__ 日语 `japanese/kinput2 `__ 日语 `japanese/scim-anthy `__ 日语 `japanese/scim-canna `__ 日语 `japanese/scim-honnoka `__ 日语 `japanese/scim-honoka-plugin-romkan `__ 日语 `japanese/scim-honoka-plugin-wnn `__ 日语 `japanese/scim-prime `__ 日语 `japanese/scim-skk `__ 日语 `japanese/scim-tables `__ 日语 `japanese/scim-tomoe `__ 日语 `japanese/scim-uim `__ 日语 `japanese/skkinput `__ 日语 `japanese/skkinput3 `__ 日语 `japanese/uim-anthy `__ 韩语 `korean/imhangul `__ 韩语 `korean/nabi `__ 韩语 `korean/scim-hangul `__ 韩语 `korean/scim-tables `__ 越南语 `vietnamese/xvnkb `__ 越南语 `vietnamese/x-unikey `__ ====== =========================================================================================================================