本地语言的支持依赖于 /etc/locale.conf
,/etc/locale.conf
包含不少于此相关的环境变量。更改此文件后,可能会出现以下的变化:
大量的程序界面语言的本地化
修正字符在字母、数字和其它类的分类。对于非英语区域设置来说,只有这样,bash 才能正常显示非 ASCII 字符
国家顺序可以按照字母顺序正常排序(译者注:这里所谓的正常排序,应该是首先将国家名称转换成本地语言的国家名称,比如中国的开头字母是 Z,那么显示就很靠后了。但是假如显示为英文,就是 C 开头,那么将会靠前显示。)
默认纸张尺寸
货币、时间和日期值的格式
/etc/locale.conf
中 <ll>
使用语言代码代替(比如中文是 zh,英文是 en),<CC>
使用国家代码代替(比如中国是 CN,中国香港是 HK,中国台湾是 TW,美国是 US),<charmap>
使用选定字符集指定的标准字符映射表替换。诸如 “@euro”
这样的可选修饰符也可使用。
运行以下命令可以获得当前 Glibc 支持的本地字符集。
locale -a
字符映射表可能存在很多的别名,比如 “ISO-8859-1”
可以写作 “iso8859-1” 或
“iso88591”。但是有一些程序不支持这些乱七八糟的写法(比如
UTF-8 只能写作 UTF-8,utf8
它就不认识了)。所以,为了安全起见,在设置的时候还是尽量的使用特定区域设置的规范名称。可以通过以下命令,查询在特定区域下的
字符映射表标准名称,<locale name>
为运行
locale -a 输
出的首选区域设置(这里以 zh_CN.utf8 为例)。
LC_ALL=<locale name>
locale charmap
对于 “zh_CN.utf8” 以上命令将会如下输出:
UTF-8
根据以上输出,我们再次修改 /etc/locale.conf
,
将字符映射表设置为标准形式(zh_CN.utf8 变为
zh_CN.UTF-8)。同理,也可一并查询以下设置的标准命令,然后将其添加到 bash 的启动文件中(译者注:对于 bash
来说,启动文件为 .bashrc)。
LC_ALL=<locale name> locale language LC_ALL=<locale name> locale charmap LC_ALL=<locale name> locale int_curr_symbol LC_ALL=<locale name> locale int_prefix
以上的命令将会打印当前区域设置的语言、字符编码、本地货币单位以及电话国际编码。如果出现类似下文的错误输出,可能是你没有严格按照第六章指导的方法操作或者是你当前所用的 Glibc 不支持。
locale: Cannot set LC_* to default locale: No such file or directory
如果这种情况真的发生,你应该使用 localedef 命令安装对应的系统区域,或者是考虑更改为其它的区域。假如没有出现错误提示,我们就可以继续进行下一步操作了!
有一些 LFS 之外的包可能出现对你设置的区域支持很差劲的情况。比如 X 的库(X Windows System 的一部份),就可能在内部文件中输出以下消息:
Warning: locale not supported by Xlib, locale set to C
在若干情况下,Xlib 希望以带规范破折号的大写形式列出字符映射表。比如 "ISO-8859-1" 而不应该写作 "iso88591"。不过,也可以通过去除区域规范中的字符映射部分找到合适的规范。这可以通过运行 locale charmap 命令来检查。例如,需要更改 "de_DE.ISO-8859-15@euro" 为 "de_DE@euro" 以便 Xlib 能识别区域。
即便如此,也可能遇到某些程序因为区域设置和它们预置的不同而导致功能异常(可能不会显示任何的错误消息)。如果出现这样的情况,可以通过查看其它的发行版是如何进行设置区域,从而得到启发。
一旦确定了到底该使用哪个区域设置,就可以创建 /etc/locale.conf
文件了:
cat > /etc/locale.conf << "EOF"
LANG=<ll>_<CC>.<charmap><@modifiers>
EOF
也可以通过 systemd 提供的实用程序 localectl
修改
/etc/locale.conf
:
localectl set-locale LANG="<ll>_<CC>.<charmap><@modifiers>
"
此处,也可以指定其它和语言相关的环境变量,例如 LANG
,LC_CTYPE
,LC_NUMERIC
或任何其它 locale
输出的环境变量,只需要用一个空格分开它们就可以了。以下示例中,LANG
设置为
en_US.UTF-8,但 LC_CTYPE
设置为 en_US:
localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"
localectl 仅可用于 systemd 环境(译者注:你要是用 SysVinit 什么的就别用这个命令瞎捣乱了)。
“C” (默认)和 “en_US” (推荐美国英语用户使用)这两种区域设置有所不同。“C” 使用 US-ASCII 7 位字符集,并把设置了最高位的字节作为无效字符。这就是为什么类似 ls 的命令本地化时会用疑问号代替。 同样,如果你想要使用 Mutt 或 Pine 发送包含有类似字符的邮件,将会得到如下消息:非 RFC 兼容字符(发送邮件中的字符集为 “unknown 8-bit”)。 所以,如果你一定以及肯定一定不会用到 8 位的字符,那你可以仅使用“C”。
不少程序还不支持 UTF-8 区域设置。我们正在完善文档并修复类似问题,可以查看 http://www.linuxfromscratch.org/blfs/view/systemd/introduction/locale-issues.html。