locale -a命令直接列出系统中已生成(即已安装且编译完成)的locale,如zh_cn.utf8、en_us.utf8等,反映实际可用的语言环境,而非仅安装的语言包软件。

怎么用 locale -a 查看所有可用语言环境
系统里“安装了哪些语言包”,本质是看 locale 数据库里有哪些 locale 定义。最直接、跨发行版通用的方法就是运行:locale -a
这个命令会列出所有已生成(即已安装且编译完成)的 locale,比如:zh_CN.utf8en_US.utf8ja_JP.utf8
注意:locale -a 不显示“已下载但未生成”的语言包 —— 比如你只装了 glibc-langpack-zh RPM 包,但没运行 localedef 或没触发系统自动编译,zh_CN.utf8 就不会出现在 locale -a 输出里。
常见过滤写法:
-
locale -a | grep zh—— 快速找中文相关 locale -
locale -a | grep -i utf—— 排查是否含 UTF-8 编码变体 -
locale -a | wc -l—— 粗略统计总数(CentOS 7 默认约 1500+,Fedora 可能超 3000)
为什么 rpm -qa | grep lang 或 apt list --installed | grep language 不够准
包管理器看到的是“语言包软件包”,不是实际生效的语言环境。比如:
- RHEL/CentOS 上装了
glibc-langpack-zh,但若系统未调用localedef生成zh_CN.utf8,locale -a仍不显示它 - Ubuntu 上装了
language-pack-zh-hans,但若没执行sudo locale-gen,对应 locale 也不会激活 -
fonts-chinese这类字体包根本不会出现在locale -a中,但它影响中文显示——属于另一层依赖
所以只查包名容易误判:包存在 ≠ 语言环境可用 ≠ 中文能正常显示。
localectl list-locales 和 locale -a 有啥区别
在基于 systemd 的系统(RHEL 8+/CentOS 8+、Fedora、Debian 10+)上,localectl list-locales 是更推荐的替代命令:
- 输出格式更干净,不带冗余空行和编码提示
- 内部调用同一套数据源,结果和
locale -a一致,但做了排序和去重 - 某些最小化安装镜像可能没装
localectl(它属于systemd工具集),而locale几乎总在glibc-common里
如果你运行 localectl 报错 command not found,就老实用 locale -a。
桌面环境里看到的语言列表 ≠ 终端里生效的语言
GNOME/KDE 设置里的“已安装语言”是图形界面自己维护的一套缓存,常通过 gsettings 或 plasma-localization 管理,和终端底层的 glibc locale 是两套机制。
典型现象:
- GNOME 设置里勾选了中文,但 SSH 连上去
locale还是POSIX或en_US -
locale -a有zh_CN.utf8,但 GNOME 登录界面仍是英文 —— 可能缺langpacks-zh或翻译文件未部署
验证是否真能用,永远以 LANG=zh_CN.utf8 locale 实际跑一次为准,别信 GUI 界面的“已安装”标签。











