locale 是 Linux 系统中多语言环境的接口,每个 locale 都定义了地区、语言和字符集。除 C 和 POSIX 这两个 locale 名称外,locale 的命名规则是:<语言>_<地区>.<字符集编码><@修正值>
,如 zh_CN.UTF-8
中,zh
表示中文,CN
表示中国大陆,UTF-8
表示字符集。
通常系统安装了 locale ,如没有安装,可以通过 sudo apt install locale
来安装。这些 locale 在 Debian & Ubuntu 系统中的默认存放目录为:/usr/share/i18n/locales/。
一、查看可用的语言环境
1. locale -a
可以列出所有可用的语言环境,加 -v
选项可以输出更详细的信息。
$ locale -a
C
C.utf8
POSIX
zh_CN.utf8
这里的 C 和 POSIX 这两个 locale 是系统默认可用的语言环境,如果不设置任何语言环境的话,那可用及当前的语言环境就会默认是 C 和 POSIX
2. localectl list-locales
也可以查看系统可用语言环境
$ localectl list-locales
C.UTF-8
zh_CN.UTF-8
3. 如果我们知道系统可用语言环境配置文件是位于 /etc/locale.gen 的话,还可以通过 cat
命令来直接查看:
$ cat /etc/locale.gen | grep -v "^$" | grep -v "#"
zh_CN.UTF-8 UTF-8
二、配置可用的语言环境
通过修改 /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(语言环境)
1. 通过 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=
看不懂?补习一下:操作系统根据区域不同以及人们对于计算机的输入习惯,将 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 对自身包含信息的概述 |
但是,我们发现从输出结果发现,除了上面提到的 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 -a
和 locale
两个命令,输出了不同的信息,为了避免蒙圈,还是 --help
一下吧。
$ locale --help
用法: locale [选项...] 名称
或: locale [选项...] [-a|-m]
给出区域特定的信息。
系统信息:
-a, --all-locales 写出可用区域的名称 # 也就是显示可用语言环境
-m, --charmaps 写出可用字符映射的名称 # 语言环境中点(.)后面的就是字符映射了
修改输出格式:
-c, --category-name 写出选中范畴的名称 # 也就是那十二个以 LC_ 开头的大类 LC_*(不含 LC_ALL)
-k, --keyword-name 写出选中关键字的名称 # 每个大类都有一些常用的显示格式,以键值对的形式出现
-v, --verbose 打印更多信息
-?, --help 给出此帮助列表
--usage 给出简要的用法信息
-V, --version 打印程序版本号
locale 命令的其他几个用法:
$ locale -k LC_TIME # 查看 LC_TIME 这个大类的键值对,加上 -c 参数还可以显示选中范畴(或者说大类)的名称(这里是它本身 LC_TIME)
abday="日;一;二;三;四;五;六"
day="星期日;星期一;星期二;星期三;星期四;星期五;星期六"
abmon="1月;2月;3月;4月;5月;6月;7月;8月;9月;10月;11月;12月"
mon="一月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月"
am_pm="上午;下午"
d_t_fmt="%Y年%m月%d日 %A %H时%M分%S秒"
d_fmt="%Y年%m月%d日"
t_fmt="%H时%M分%S秒"
t_fmt_ampm="%p %I时%M分%S秒"
...(略)
$ locale -k day # 查看关键字名 day 的 键值对,加上 -c 参数还可以显示选中范畴名称(LC_TIME),见下一条命令
day="星期日;星期一;星期二;星期三;星期四;星期五;星期六"
$ locale -kc day # 查看关键字名 day 的 键值对及所在的范畴名(LC_TIME),因此,-kc 选项更加直观
LC_TIME
day="星期日;星期一;星期二;星期三;星期四;星期五;星期六"
2. 通过 localectl status
可以查看系统 locale 的信息
$ localectl status
System Locale: LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
VC Keymap: (unset)
X11 Layout: cn
X11 Model: pc105
四、 设置系统的语言环境:
1. 修改配置文件
debian 等系统的语言环境配置文件为 /etc/default/locale ,而redhat 等系统的语言环境配置文件则为 /etc/locale.conf
以 debian 为例
$ sudo vim /etc/default/locale # 此时配置文件已经修改了,但环境变量还没生效(可以通过 locale 命令查看),需要通过 source 命令刷新生效
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
$ source /etc/default/locale # 刷新配置文件,使修改生效
2. 通过命令来设置
可以通过 set-locale LOCALE...
或者 update-locale [OPTIONS] [LANG=locale] [LC_NUMERIC=locale] ...
来设置系统的语言环境
$ sudo localectl set-locale LANGUAGE=zh_CN:zh
$ source /etc/default/locale # 刷新配置文件,使修改生效
或者
$ sudo update-locale LANGUAGE=zh_CN:zh
$ source /etc/default/locale # 刷新配置文件,使修改生效
3. 通过修改环境变量文件来设置
比如,在 /etc/profile
文件代码的最后添加定义环境变量的语句,然后执行 source /etc/profile
后生效。如:
$ sudo vim /etc/profile
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:zh