最稳路径是直接修改 /etc/default/locale 并执行 sudo locale-gen zh_cn.utf-8;需先安装 language-pack-zh-hans 和 language-pack-zh-hans-base,确保 locale -a | grep -i zh_cn 输出 zh_cn.utf8 和 zh_cn.utf-8,再写入 lang=zh_cn.utf-8、language=zh_cn:zh、lc_all=zh_cn.utf-8 并运行 sudo update-locale。

直接改 /etc/default/locale 并配合 locale-gen 是最稳的路径,图形界面设置只是改了用户级偏好,不保证终端、服务、cron 任务等全部生效。
检查当前 locale 状态是否真生效
很多人以为在 Settings 里拖了中文到顶部就完事了,但终端里 locale 一跑还是 en_US.UTF-8。这是因为图形界面只改了 ~/.profile 或 D-Bus session 环境,而系统级服务、SSH 登录、后台任务读的是 /etc/default/locale。
- 运行
locale,重点看LANG和LC_ALL是否为zh_CN.UTF-8 - 运行
locale -a | grep zh_CN,确认zh_CN.utf8(注意大小写和下划线)已生成;没输出说明 locale 尚未生成,不能跳过下一步 -
cat /etc/default/locale查看系统级默认配置,这里才是 root cause 所在
安装语言包 + 生成 zh_CN.UTF-8 locale
只装 language-pack-zh-hans 不够,locale-gen 需要底层 locale 定义文件存在,否则会报错 “locale not found”。
- 先更新并安装完整语言支持:
sudo apt update && sudo apt install language-pack-zh-hans language-pack-zh-hans-base -y - 再生成 locale:
sudo locale-gen zh_CN.UTF-8(注意:不是zh_CN.utf8,Ubuntu 默认用大写 UTF-8) - 验证生成结果:
locale -a | grep -i zh_cn应该至少看到zh_CN.utf8和zh_CN.UTF-8两项 - 如果报错 “cannot open locale definition file”,说明语言包没装全,回退重装
强制写入系统级 locale 配置
图形界面点“Apply System-Wide”本质是调用 update-locale,但它有时漏写 LC_ALL,而 LC_ALL 会覆盖所有其他 LC_* 变量——这点容易被忽略,导致日期/数字格式仍是英文。
- 编辑系统配置:
sudo nano /etc/default/locale - 写死三行(不要留空行,不要加引号):
LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_ALL=zh_CN.UTF-8
- 保存后立即生效:
sudo update-locale(它会重读该文件并刷新环境) - 重启终端或重新登录,再跑
locale,所有字段都应显示zh_CN.UTF-8
终端仍显示英文?检查 shell 初始化文件
即使系统级 locale 正确,某些终端(尤其是 tmux、screen 或远程 SSH)可能加载了用户自己的 ~/.bashrc 或 ~/.profile,里面硬编码了 export LANG=en_US.UTF-8,会覆盖系统设置。
- 搜一下:
grep -n "LANG=" ~/.bashrc ~/.profile ~/.bash_profile 2>/dev/null - 如果有匹配项,注释掉或删掉那行;不要写
export LANG=...,让系统配置自然生效 - 临时验证:
exec bash或新开终端,再跑locale - 特别注意:WSL 或容器环境常自带初始化脚本,得查
/etc/profile.d/下是否有冲突脚本
真正麻烦的不是设成中文,而是让所有上下文(GUI、TTY、SSH、systemd service、crontab)读取同一套 locale。关键就两点:locale-gen 必须成功生成目标 locale,/etc/default/locale 必须写全 LANG 和 LC_ALL,其余都是干扰项。











