Linux环境的本地化配置

我在部署 边缘云Raspberry Pi OS桌面 遇到默认环境是UK以及莫名的locale配置导致 raspi-config 工具界面设置混乱问题。这使得我发现,平时我们忽视的 Linux locale 环境设置,其实影响到应用程序的交互显示,以及键盘输入布局等设置。本文尝试做一些梳理。

备注

其实后来我发现,原来是不小心配置了 /etc/locale.gen 中激活了:

es_US.UTF-8 UTF-8

es_USSpanish, U.S.A. (美国西班牙),所以导致系统显示出我不认识的字符(西班牙语)。而我本意是设置 en_US.UTF-8 (美式英语)

环境变量优先级

locale 环境变量告诉操作系统如何显示或输出文本,这些环境变量有优先级:

LANGUAGE
LC_ALL
LC_xxx
LANG

例如,可以使用 LANG 变量设置 French 字符集作为语言,但是通过 LC_TIME 设置美国时间格式。

Locale环境变量

要设置某国的本地化支持,必须首先 locale-gen 对应的本地化。举例,要支持 ro_RO.UTF-8 UTF-8 ,首先需要编辑 /etc/locale.gen 配置,使得以下行配置生效:

# ro_RO.UTF-8 UTF-8
ro_RO.UTF-8 UTF-8

然后执行:

sudo locale-gen

然后才能设置使用 ro_RO.UTF-8 作为变量,否则执行 export LC_TIME=ro_RO.UTF-8 会提示报错:

-bash: warning: setlocale: LC_TIME: cannot change locale (ro_RO.UTF-8): No such file or directory
  • 使用 locale 命令可以显示当前环境变量设置,例如:

    LANG=en_US.UTF-8
    LANGUAGE=en_US
    LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC=ro_RO.UTF-8
    LC_TIME=ro_RO.UTF-8
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY=ro_RO.UTF-8
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER=ro_RO.UTF-8
    LC_NAME=ro_RO.UTF-8
    LC_ADDRESS=ro_RO.UTF-8
    LC_TELEPHONE=ro_RO.UTF-8
    LC_MEASUREMENT=ro_RO.UTF-8
    LC_IDENTIFICATION=ro_RO.UTF-8
    LC_ALL=
    

LANG 变量

LANG 环境变量处理Linux系统的语言,Linux系统会按照这个变量设置来输出系统消息。如果这个语言变量没有设置,或者某个消息没有被翻译成这个指定语言,则默认是英语。

LC_xxx 变量

  • LC_TIME 设置时钟显示格式,例如:

    export LC_TIME=ro_RO.UTF-8
    

然后执行 date 就会看到:

miercuri 9 februarie 2022, 15:27:06 +0800

也可以恢复到US时钟显示格式:

export LC_TIME=en_US.UTF-8

此时再次执行 date 显示:

Wed 09 Feb 2022 03:28:13 PM CST

LC_MESSAGES

LC_MESSAGES 设置打印输出消息的语言,类似于 LANG ,但是可以设置不同的变量:

$ locale | grep -w LANG
LANG=en_US.UTF-8
$ export LC_MESSAGES=de_DE.UTF-8

则此时输出语言是德语

其他本地化变量:

  • LC_NUMERIC 本地化数字格式

LC_ALL

LC_ALL 是一个最强硬本地化变量,除了 LANGUAGE 以外,会覆盖所有其他变量,并且是操作系统首先检查的本地化设置。

举例:

export LC_ALL=en_EN.UTF-8

备注

如果设置 LC_ALL=C 则字符排序会按照 ASCII 码进行

键盘布局

Raspbery Pi OS(Raspbian) 是debian操作系统,键盘布局配置位于 /etc/default/keyboard

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"

上述配置适合大多数我们常用的键盘布局 - 美式键盘布局

参考