Locale (简体中文)
glibc 和应用程序、函数库库使用 区域设置 显示本地化的文字、货币、时间、日期、特殊字符等包含地域属性的内容。
生成区域设置
区域设置的名称通常用 [language][_TERRITORY][.CODESET][@modifier]
的格式表示,language 是 ISO 639 语言代码, territory 是 ISO 3166 国家代码, codeset 是 字符集 或 ISO-8859-1、UTF-8 这样的编码方式。请参考 setlocale(3)。
要列出所有启用的区域设置,使用:
$ locale -a
启用一个区域设置前,需要先生成它。在 /etc/locale.gen
中取消对应的注释,然后执行 locale-gen。注释掉某行,则会移除对应的区域设置。请启用所有用户都可能使用的区域设置及相关#变量。
例如对于使用美式英语和中国简体的用户:
/etc/locale.gen
... #en_SG ISO-8859-1 en_US.UTF-8 UTF-8 #en_US ISO-8859-1 ... #zh_CN.GBK GBK zh_CN.UTF-8 UTF-8 #zh_CN GB2312 ...
编辑完成以后,通过下面的命令生成 Locale:
# locale-gen
设置当前区域
想要显示正在使用的 Locale 和相关的环境变量,运行:
$ locale
要使用的区域设置(从前面生成的区域设置中选择)设置在 locale.conf
文件中。每一个 locale.conf
文件都必须包含一些环境变量赋值语句,其格式与 locale 命令输出的格式相同。
要查看已经生成的区域设置:
$ localedef --list-archive
或者使用 localectl(1):
$ localectl list-locales
系统区域设置
要设置整个系统使用的区域设置,需要在 /etc/locale.conf
中写入 LANG
变量,以下的 zh_CN.UTF-8 应为 /etc/locale.gen
中某个未注释条目的第一列:
locale.conf
LANG=zh_CN.UTF-8
或者使用:
# localectl set-locale LANG=zh_CN.UTF-8
参阅#变量和 localectl(1) 获得更多细节。
在用户会话中覆盖系统区域设置
系统使用的区域设置可以通过用户编辑自己的 ~/.config/locale.conf
(更一般地,$XDG_CONFIG_HOME/locale.conf
或 $HOME/.config/locale.conf
)来覆盖。
这些 locale.conf
文件的优先级定义在 /etc/profile.d/locale.sh
中。
- 设置用户级区域设置 ,能让
/var/log
中的日志以英语输出而在用户环境中使用所选语言。 - 建立
/etc/skel/.config/locale.conf
文件,可以让所有通过 useradd 命令和-m
选项创建的新用户自动拥有一份相应的~/.config/locale.conf
。
立即启用新设置
locale.conf
的变更会在下次登录时生效,要立刻应用新的设置的话,可以运行:
$ unset LANG $ source /etc/profile.d/locale.sh
LANG
变量必须先被 unset
,否则 locale.sh
不会从 locale.conf
中更新变量。只有新增的或被修改的命令会被自动更新,从 locale.conf
被移除的变量在注销前依然存在。其它用例
和区域设置相关的变量也能像其他的环境变量一样传递给其它程序。
例如在开发和测试某个程序时,可以这样运行:
$ LANG=C ./my_application.sh
类似的,也可以通过设置环境变量让当前 shell 中运行的程序使用特定的区域设置(例如安装系统时):
$ export LANG=C
变量
locale.conf
文件支持以下环境变量。
- LANG
- LANGUAGE
LC_ADDRESS
- LC_COLLATE
LC_CTYPE
LC_IDENTIFICATION
LC_MEASUREMENT
LC_MESSAGES
LC_MONETARY
LC_NAME
LC_NUMERIC
LC_PAPER
LC_TELEPHONE
- LC_TIME
locale(7) 包含了完整 LC_*
列表,locale(5) 包含了详细定义。
LANG:默认的区域设置
这个变量的值会覆盖掉所有未设置的 LC_*
变量的值。
LANG
设置为 es_ES.UTF-8
,并将 LC_MESSAGES
(用于消息翻译的用户界面)设置为 en_US.UTF -8
。LANGUAGE:后备区域设置
使用 gettext 翻译的软件会按照 LANGUAGE
选择使用的语言。用户通过这个变量指定一个区域设置列表,如果前面的区域设置缺少翻译,会自动使用后面的区域设置显示界面。例如一个澳大利亚用户可能更希望在没有合适的澳大利亚英语翻译时回退到英式英语而不是美式英语:
locale.conf
LANG=en_AU.UTF-8 LANGUAGE=en_AU:en_GB:en
LC_TIME:时间和日期格式
如果 LC_TIME
设置成 en_US.UTF-8
,日期的格式为 "MM/DD/YYYY"。要使用 ISO 8601 标准的日期格式( "YYYY-MM-DD" ) ,使用:
locale.conf
LC_TIME=en_DK.UTF-8
glibc 2.29 修复了一个错误,en_US.UTF-8
开始如预期般显示 12 小时格式的时间。如果要使用 24 小时制,请使用 LC_TIME=en_GB.UTF-8
。
LC_COLLATE:排序格式
这个变量的值决定排序和正则表达式的格式顺序。
例如将它设置为 C
可以让 ls 命令首先列出点开头的文件,然后是大写字母开头的文件和小写字母开头的文件:
locale.conf
LC_COLLATE=C
另见 [3]。
为了避免潜在的问题,Arch Linux 曾经在 /etc/profile
中设置 LC_COLLATE=C
,这个方法已经过时了。
LC_ALL:测试和排除问题
这个变量的值会覆盖掉 LANG
和所有 LC_*
变量的值,无论它们是否设置。
只有 LC_ALL
不能出现在 locale.conf
文件中:它只能为了测试和排除问题而设置,例如在 /etc/profile
中。
疑难解答
我的终端不支持 UTF-8
这里列出了一些(不是全部)支持 UTF-8 的终端:
- gnustep-terminal
- konsole
- mlterm
- rxvt-unicode
- st
- 基于 VTE 的终端
-
xterm - 启动时使用参数
-u8
,或者配置资源xterm*utf8: 2
。
Gnome-terminal / rxvt-unicode 不支持 UTF-8
你必须在 UTF-8 的区域设置下运行它们才会有作用。按照上面的方法启用 en_US.UTF-8
(或者其它使用 UTF-8 的区域设置)并将它设置成默认区域设置后重启系统。
我的系统的语言还是不对
可能其它文件设置了本该由 locale.conf
设置的区域设置(例如 ~/.pam_environment
),详见 定义环境变量。
如果使用了桌面环境,可能是被桌面环境修改。例如 GNOME 的语言设置会覆盖 locale.conf
中的设置。
KDE Plasma 也通过系统设置修改界面的语言,如果按本文修改后还是原来的区域设置,请删除 ~/.config/plasma-localerc
(之前是:~/.config/plasma-locale-settings.sh
)。
如果您正在结合 accountsservice 使用显示管理器,请遵循 Display manager (简体中文)#设置语言 中的说明。
LightDM 将自动使用 accountsservice 来设配置用户的区域设置(如果已安装)。否则,LightDM 将用户会话配置存储在 ~/.dmrc
中。也可能从那里检索到意料外的的区域设置。