locale 是 Linux 系统中多语言环境的接口,每个 locale 都定义了地区、语言和字符集。locale 的语法规则是:<语言>_<地区>.<字符集编码><@修正值>
,如 zh_CN.UTF-8
中,zh
表示中文,CN
表示中国大陆,UTF-8
表示字符集。
locale -a
可以列出所有可用的语言环境/字符集,加 -v
选项可以输出更详细的信息。
$ locale -a
bo_CN.utf8
C
C.utf8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
...
这些 locale 在 ubuntu 系统中的默认存放位置为:/usr/share/i18n/locales。
可以筛选查看是否存在可用的中文语言环境:
$ locale -a | grep ^zh
zh_CN.utf8
zh_SG.utf8
如果没有发现可用的中文语言环境,则需要安装中文语言包 language-pack-zh-hans
:
$ sudo apt install language-pack-zh-hans
通过修改 /etc/locale.gen
文件,将 #zh_CN.UTF-8 UTF-8
前面的注释去掉保存,并执行 sudo locale-gen
命令使之生效。
比如,我们通常启用的是中文、英文、藏文:
$ sudo vim /etc/locale.gen
...
zh_CN.UTF-8 UTF-8
en_US.UTF-8 UTF-8
bo_CN.UTF-8 UTF-8
...
$ sudo locale-gen
操作系统根据区域不同以及人们对于计算机的输入习惯,将 locale(语言环境/字符集)归纳为 12 大类,并且分别赋予了 12 个环境变量,即12个 LC_*
。
变量 | 含义 |
---|---|
LC_CTYPE: | 语言符号及其分类 |
LC_NUMERIC: | 数字 |
LC_TIME: | 时间显示格式 |
LC_COLLATE: | 比较和排序习惯 |
LC_MONETARY: | 货币单位 |
LC_MESSAGES: | 信息,如提示信息、错误信息、状态信息、标题、标签、按钮和菜单等 |
LC_PAPER: | 默认纸张大小 |
LC_NAME: | 姓名书写方式 |
LC_ADDRESS: | 地址书写方式 |
LC_TELEPHONE: | 电话号码书写方式 |
LC_MEASUREMENT: | 度量衡表达方式 |
LC_IDENTIFICATION: | locale 对自身包含信息的概述 |
我们通过 locale
命令可以查看当前的语言环境(字符集)的环境变量:
$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
从输出结果发现,除了上面提到的 12 个 LC_*
以外,还有 3 个变量,分别是 LC_ALL
、LANG
和 LANGUAGE
。
这里需要分别说明,其中的 2 个变量:LC_ALL
、LANG
与当前 locale 有关。而且,它们之间有一个优先级的关系:LC_ALL
> LC_*
> LANG
。
LC_ALL
的值,则 LC_*
和 LANG
的值将会强制转换为 LC_ALL
的值LANG
的值,如果 LC_*
有值,则 locale 采用该值(LC_*
> LANG
);而没有赋值的 LC_*
,则 locale 会采用 LANG
的值。LC_ALL
、LANG
和 LC_*
都不设置的话,系统将采用 POSIX 作为 lcoale,也就是 C locale。至于另一个变量 LANGUAGE
则是用来指定应用程序的界面语言的。
理解了上面的知识之后,我们就可以来设置当前的 locale 了。大概有下面几种设置 locale 的方法:
/etc/profile
文件在 /etc/profile
文件代码的最后添加定义环境变量的语句,然后执行 sudo source /etc/profile
后注销生效。如:
sudo vim /etc/profile
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:zh
这种方法比较可靠,因为这个环境变量的调用发生在系统启用的最后阶段。
$ sudo localectl set-locale LANG=zh_CN.UTF-8
这个命令其实就是对 LANG
变量以及未赋值的 LC_*
变量进行赋值。对于已经赋值的 LC_*
变量是不起作用的,当然可以单独对 LC_*
变量进行赋值,如:
$ sudo localectl set-locale LC_CTYPE=zh_CN.UTF-8
/etc/default/locale
文件$sudo vim /etc/default/locale
LANG=zh_CN.UTF-8
LANGUAGE="zh_CN:zh"
如上,将 LANG=zh_CN.UTF-8
和 LANGUAGE="zh_CN:zh"
写入该文件,注销或重启生效。
/etc/locale.conf
文件/etc/locale.conf
文件的内容同上面/etc/default/locale
文件的内容一样,然后通过通过 source /etc/locale.conf
使其生效。
$sudo vim /etc/locale.conf
LANG=zh_CN.UTF-8
LANGUAGE="zh_CN:zh"
ps:根据第2、第3和第4种方法,在设置了变量值以后,在某些桌面环境会往往会无效,如 UKUI。这是因为 UKUI 在启动时会再次对 locale 进行设置。