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_ALLLANGLANGUAGE

再补习一下:这里的 2 个变量:LC_ALLLANG 与当前 locale 有关。而且,它们之间有一个优先级的关系:LC_ALL > LC_* > LANG

  • 当设置了 LC_ALL 的值,则 LC_*LANG 的值将会强制转换为 LC_ALL 的值
  • 当设置了 LANG 的值,如果 LC_* 有值,则 locale 采用该值(LC_* > LANG);而没有赋值的 LC_* ,则 locale 会采用 LANG 的值。
  • 如果 LC_ALLLANGLC_* 都不设置的话,系统将采用 POSIX 作为 lcoale,也就是 C locale。

至于另一个变量 LANGUAGE 则是用来指定应用程序的界面语言的。

locale 命令的其他用法

上面我们使用了 locale -alocale 两个命令,输出了不同的信息,为了避免蒙圈,还是 --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