本地语言支持需要一些环境变量。正确设定它们可以带来以下好处:
程序输出被翻译成本地语言
字符被正确分类为字母、数字和其他类别,这对于使 bash 正确接受命令行中的非 ASCII 本地非英文字符来说是必要的
根据所在地区惯例排序字母
适用于所在地区的默认纸张尺寸
正确格式化货币、时间和日期值
将下面的 <ll>
替换为所需语言的双字符代号 (例如“en”),<CC>
替换为国家或地区的双字符代号 (例如
GB
),<charmap>
替换为您选定的 locale
的标准字符映射。另外,还可以加入 @euro
等可选修饰符。
Glibc 支持的所有 locale 可以用以下命令列出:
locale -a
字符映射可能有多个别名,例如 ISO-8859-1
也可以称为
iso8859-1
或者 iso88591
。某些程序不能正确处理一些别名 (例如,UTF-8
必须写作 UTF-8
才能识别,而不能识别 utf8
),因此在多数情况下,为了保险起见,最好使用
locale 的规范名称。为了确定规范名称,执行以下命令,将 <locale 名>
替换成 locale -a 对于您希望的 locale 的输出 (以
en_GB.iso88591
为例)。
LC_ALL=<locale 名>
locale charmap
对于 en_GB.iso88591
locale,以上命令输出:
ISO-8859-1
这样就最终确定 locale 应设置为 en_GB.ISO-8859-1
。在将以上启发方法获得的 locale 添加到 Bash
启动文件之前,一定要进行下列测试:
LC_ALL=<locale 名> locale language LC_ALL=<locale 名> locale charmap LC_ALL=<locale 名> locale int_curr_symbol LC_ALL=<locale 名> locale int_prefix
以上命令应该输出语言名称,选定 locale 使用的字符编码,本地货币符号,以及所在国家或地区的国际电话区号。如果以上某个命令失败并输出类似下面这样的消息,意味着您的 locale 在第 8 章中没有安装,或者不被 Glibc 的默认安装支持。
locale: Cannot set LC_* to default locale: No such file or directory
如果出现了这种消息,您应该用 localedef 命令安装所需的 locale,或重新选择一个不同的 locale。后文假设 Glibc 没有输出类似错误消息。
其他软件包在 locale 名不符合它们的期望时可能工作不正常(但未必输出错误消息)。在这种情况下,探索一下其他 Linux 发行版是如何支持您的 locale 的,可以得到一些有用的信息。
在确定了正确的 locale 设置后,创建 /etc/locale.conf
文件:
cat > /etc/locale.conf << "EOF"
LANG=<ll>_<CC>.<charmap><@modifiers>
EOF
Shell 程序 /bin/bash
(下文称为 “shell”)
使用一组初始化文件,以帮助创建其运行环境。这些文件有不同的使用场合,可能以不同方式影响登录和交互环境。/etc
中的文件提供全局设定。如果对应的文件同时在用户主目录中存在,它们可能覆盖全局设定。
/bin/login 在用户成功登录后,会读取
/etc/passwd
中指定的 shell,并启动一个交互式登录 shell
进程。而交互式非登录 shell 会在使用命令行直接运行 shell 时 (例如 [prompt]$
/bin/bash) 启动。非交互式 shell 在运行 shell
脚本时启动。在处理脚本时,shell 不会在执行两条命令的间隔中等待用户输入,因此是非交互的。
登录 shell 往往不会使用 /etc/locale.conf
中的设定。创建 /etc/profile
以读取 /etc/locale.conf
中的 locale
设定值并导出它们以设定您期望的 locale,但是在 Linux
控制台中运行时则使用 C.UTF-8
locale (以防程序输出 Linux
console 无法显示的字符):
cat > /etc/profile << "EOF"
# Begin /etc/profile
for i in $(locale); do
unset ${i%=*}
done
if [[ "$TERM" = linux ]]; then
export LANG=C.UTF-8
else
source /etc/locale.conf
for i in $(locale); do
key=${i%=*}
if [[ -v $key ]]; then
export $key
fi
done
fi
# End /etc/profile
EOF
修改 /etc/locale.conf
的另一种方法是使用 systemd 的
localectl 工具。例如,要使用
localectl 完成上面给出的
locale 设置,运行命令:
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 命令在 chroot 环境无法工作。只有在使用 systemd 引导 LFS 系统后才能使用它。
C
(默认 locale) 和 en_US
(推荐美式英语用户使用的 locale) 是不同的。C
locale 使用 US-ASCII 7 位字符集,并且将最高位为 1
的字节视为无效字符。因此,ls
等命令会将它们替换为问号。另外,如果试图用 Mutt 或 Pine 发送包含这些字符的邮件,会发出不符合 RFC 标准的消息
(发出邮件的字符集会被标为 unknown 8-bit
,即“不明
8 位字符集”)。因此,您只能在确信自己永远不会使用 8 位字符时才能使用 C
locale。