1. 改了 locale 重启还是英文:先看看你卡在哪个环节
折腾 Kali Linux 的人应该都遇到过这个场景:装完系统第一件事就是把界面改成中文,结果网上搜出来的命令照着敲了一遍,重启以后发现还是满屏英文,或者只有浏览器是中文、文件管理器还是英文,更气人的是终端里中文文件名全变成方块。我自己就因此重装过两次系统,后来才明白问题不在系统,而在我们对"改语言"这件事的理解太表面。
Kali Linux 基于 Debian testing 分支,默认安装非常精简,很多东西并不像 Ubuntu 桌面版那样开箱即用。英文切中文这个需求,本质上要同时解决三件事:locales 语言包是否生成、系统是否有中文语言支持、当前用户的环境变量是否指向中文。任何一个环节断了,你看到的就都是失败的假象。尤其在 root 账户下面操作时,情况会更隐蔽,因为 root 的登录方式、环境变量加载机制和普通用户完全不同,很多人就是栽在这一步。
这篇文章我会把我在 root 下把 Kali 从英文改成中文的完整排查过程写出来,包括那些"看似成功实际没用"的操作是怎么失效的,以及最终能稳定解决的两套方案。不管你是刚装完 Kali 的新手,还是被某个环境变量坑过几次的老手,照着下面的链路走一遍,基本都能搞定。
在正式开始之前,先明确一下问题的适用范围:这里讨论的是 Kali Linux 2023 及之后版本,默认桌面环境为 Xfce 或 GNOME 的安装镜像。如果你用的是纯命令行版(无桌面环境),语言切换的逻辑会更简单一些,但核心步骤完全一致。
2. 三个"假成功"操作:为什么它们没有真正生效
先说结论:网上流传的 Kali 中文教程,绝大多数只告诉你"执行 dpkg-reconfigure locales 然后选 zh_CN.UTF-8",但对背后的依赖关系只字不提。你在 root 下执行完这套流程,大概率会遇到"好像设置了,又好像没设置"的尴尬状态。我在排查过程中把几个典型的"假成功"操作全踩了一遍,下面逐个拆解它们的失效原因。
2.1 只改 /etc/default/locale,重启后被打回原形
这是最常见的做法。执行 locale-gen 生成语言包之后,会把LANG=en_US.UTF-8写进 /etc/default/locale。有人图省事,直接把那一行改成LANG=zh_CN.UTF-8,再用 locale -a 一看,系统里确实有 zh_CN.UTF-8 这个条目,于是心满意足地重启。
重启之后呢?桌面还是英文,或者只在登录界面看到中文。原因在于:/etc/default/locale 只是系统级默认值,它决定的是"如果用户没有自定义,就用这个语言"。但你的桌面环境(Xfce/GNOME)和用户 shell 有自己的配置层级,比如/root/.bashrc、/root/.profile、~/.config/locale.conf,只要任何一个文件里写了LANG=en_US.UTF-8,系统默认值就会被覆盖。
我在第一次排查时就是被这个"覆盖关系"坑了。直接在 /etc/default/locale 里改成中文,然后echo $LANG还是输出 en_US.UTF-8,当时完全蒙了,以为是系统没读这个文件。后来发现是 root 的 .profile 里有一行旧的环境变量设置。
2.2 dpkg-reconfigure locales 选了中文,但压根没生成
再来说流传度最高的dpkg-reconfigure locales。这个命令的本质是重新运行 locales 包的配置脚本,让你手工选择要生成哪些语言。很多人执行到这一步会发现一个尴尬的问题:系统里根本没有 locales 包。
Kali 的极简安装镜像(尤其是用 live ISO 装完的系统)默认不带完整语言包。你敲 dpkg-reconfigure locales,系统会提示"locales 包未安装",或者干脆让你先 apt install locales。这时候你没有意识到,后续所有操作都是空中楼阁——即使你强行把 /etc/locale.gen 里的 zh_CN.UTF-8 取消注释,执行 locale-gen,它会告诉你需要先安装 locales 包。
另一个坑是:有些教程让你只选 zh_CN.UTF-8,把其他所有语言全取消勾选。看起来合理,但实际会导致系统缺少基本的 en_US.UTF-8 环境。一些比较老的软件或者脚本在运行时会 fallback 到一个不存在的 locale,产生各种奇怪的 warning 甚至崩溃。我的建议是保留 en_US.UTF-8,额外添加 zh_CN.UTF-8,两条都留着。
2.3 图形界面里的 Language Support 设置根本没这个选项
Kali 的 Xfce 桌面环境里,你在"设置管理器"里找不到像 Ubuntu 那样的"Language Support"面板。即便切换到 GNOME 桌面,系统语言设置里默认也只有 English,点击"安装/移除语言"后会让你选择从软件源安装语言包,但这一步通常是在后台静默执行的,没有任何进度提示,也不显示报错。
更迷惑的是:设置面板里的语言切换和用户环境变量之间并不是强耦合关系。你在 GUI 里把语言改成了中文,但它的本质只是生成了对应的 locale 并把设置写进了用户的桌面配置文件。一旦你打开终端,终端里的输出语言仍然由$LANG环境变量决定,不会跟随桌面设置变化。这也是"界面一部分中文、一部分英文"的经典成因。
3. 从零到一:给 Kali 补齐中文能力的完整链路
我重新梳理了正确顺序。整个过程的核心逻辑是:先确保系统能"认"中文,再让用户环境"用"中文。这两步缺一不可。下面我给你两套方案——一套是纯命令行的通用方案(任何 Kali 版本适用),一套是图形界面方案(适合不想敲命令的人),我推荐你先走命令行,因为逻辑透明、可控性强。
3.1 第一步:安装语言包,让系统知道自己能处理中文
打开终端,切换到 root(关于 root 登录的坑我放在第 4 节详细讲,这里先用 sudo -i 进入):
apt update apt install locales装完之后检查一下系统里有哪些可用的 locale:
locale -a如果你看到C、C.utf8、POSIX、en_US.utf8这四项,说明系统只有基础的英文环境,中文完全没有生成。接下来编辑 /etc/locale.gen 文件,把 zh_CN 开头的行取消注释:
nano /etc/locale.gen找到这几行:
# zh_CN.GBK GBK # zh_CN.UTF-8 UTF-8把井号去掉,保存退出,然后执行:
locale-gen这样系统就会生成中文语言编码。执行完毕后,用locale -a应该能看到 zh_CN.utf8 出现了。
3.2 第二步:设置系统默认语言为中文
生成语言包后,需要把默认语言切换成中文。传统的做法是修改 /etc/default/locale,但如前所述,这个文件只是兜底方案,真正要在当前用户环境里生效,需要同时做下面两件事。
执行:
update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 LANGUAGE=zh_CN:zh这里的LC_ALL是一个强制的全局覆盖变量,优先级高于 LANG;LANGUAGE是某些程序(特别是使用 gettext 的软件)用来匹配语言文件的变量。三个变量同时设置是为了避免某些软件只看其中某一个。如果你只设 LANG 不管 LC_ALL,典型的后果是:文件名能显示中文,但菜单里还是英文(因为菜单靠 LC_MESSAGES 控制,它默认继承自 LANG,并非所有软件都能正确读取)。
如果你想要更稳妥,可以用dpkg-reconfigure locales再走一遍向导,在复选框界面里把 zh_CN.UTF-8 和 en_US.UTF-8 都选上,然后回车。向导结束后会询问你"系统默认语言是什么",选 zh_CN.UTF-8 即可。这一步的底层原理和 update-locale 是一样的,只是方式更友好。
3.3 第三步:解决中文字体缺失问题,避免方块字
语言设置好之后,马上会遇到一个视觉问题:中文显示成方块(豆腐块)。这是因为系统没有安装支持中文显示的字型文件。Kali 默认字体只覆盖拉丁字符,中文编码虽然能被系统识别,但没有字体去渲染它。
apt install fonts-noto-cjk这是 Google 开发的思源黑体在 Debian 仓库里的包名,覆盖简体/繁体中文、日文、韩文。装完之后重启桌面会话(或者直接重启系统),方块字就会消失。如果你还想要更好看的宋体风格,可以额外装fonts-noto-cjk-extra,但我个人觉得基础包就够了。
3.4 第四步:验证环境变量是否真正生效
重新登录 root,打开终端执行:
echo $LANG echo $LC_ALL echo $LANGUAGE如果三个变量都输出zh_CN.UTF-8(或 zh_CN.utf8),说明环境变量已经正确加载。此时再执行locale命令,应该能看到以下信息:
LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC="zh_CN.UTF-8" ... LC_ALL=zh_CN.UTF-8系统区域设置已全部指向中文。这里我要提醒一个容易误判的细节:执行locale -a看到 zh_CN.utf8 只代表"可用",不代表"正在使用"。必须看locale(不带任何参数)输出的运行时状态,那才是当前会话真正生效的语言。
4. root 账户的隐蔽陷阱:su、su - 与配置文件覆盖
第 3 节的操作,普通用户做完基本就收工了。但如果你是 root 用户——准确地说,如果你长期用 root 账户操作——你会发现就算上述步骤全部做完,root 的终端里echo $LANG依然输出 en_US.UTF-8,而普通用户已经变成中文了。这个现象我前前后后花了几个小时才彻底捋清,原因有三个。
4.1 su 与 su - 的差异:环境变量是否被重置
这是最隐蔽的坑。很多人从普通用户切换到 root 时,用的命令是su,它表示"切换到 root,但保留当前用户的环境变量"。当你从一个已经设好中文环境的用户切过去时,root 的 LANG 会保持中文,看起来没问题。但如果你是从登录界面直接以 root 身份登录,或者用su -(带短横线,意为"以 root 身份重新登录"),系统会加载 root 的完整登录环境,此时 root 用户的 ~/.bashrc、/etc/profile 等文件会重新初始化环境变量。
也就是说:su 不重置环境变量,su - 重置环境变量,sudo -i 也会重置。如果你用su -切换到 root,发现 LANG 变回英文,那不是你没设置成功,而是 root 用户独立的配置文件里没有写入中文环境变量。你需要单独给 root 设置一份。
cat >> /root/.bashrc << EOF export LANG=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8 export LANGUAGE=zh_CN:zh EOF执行完后source /root/.bashrc,再验证echo $LANG。
4.2 /root/.profile 里的旧配置覆盖了系统默认值
如果你已经往 /root/.bashrc 里写入了中文环境变量,但终端每次新开窗口时 LANG 依然不是中文,问题可能出在 /root/.profile 或者 /etc/profile.d/ 下面的某个脚本。系统在启动一个交互式登录 shell 时,加载顺序是:/etc/profile -> /etc/profile.d/*.sh -> /root/.profile -> /root/.bashrc。
我在实际排查中发现,Kali 预装的某个配置文件里有一行export LANG=en_US.UTF-8,它写在 /root/.profile 中,正好把 /etc/default/locale 里设置的中文覆盖了。解决办法很简单:打开 /root/.profile,找到所有设置了 LANG、LC_ALL、LANGUAGE 的行,把它们删除或注释掉,或者在 file 最后追加你自己的 export 覆盖之前的设置。
注意追加在文末才能生效,因为 shell 执行配置是按顺序逐行解释的,后面的赋值会覆盖前面的。
4.3 Xorg 与桌面会话的 locale 传递机制
第三个坑发生在图形界面下。Kali 的桌面环境(Xfce/GNOME)在启动用户会话时,会根据系统默认 locale 来初始化 GNOME 和 GTK 程序的显示语言。如果你在终端里已经把 LANG 改成了中文,但关掉终端再打开时又恢复原样,那很可能是桌面会话缓存了旧的 locale。
这种情况下的解决方法是注销重新登录,而不是简单重启终端。如果注销后仍不生效,执行:
systemctl restart lightdm或者直接 reboot。桌面环境在会话启动时读取 locale 数据,新开终端窗口会继承会话的初始环境,但不会动态重新读取系统配置。
5. 验证、回滚与持久化成败的关键清单
语言切换这种操作,最怕"当时好了、第二天又变回去"。我在彻底搞定之后做了一次完整的验证和回滚测试,把需要考虑的边界情况都摸了一遍,这里直接给你一份可执行清单。
5.1 完整验证步骤:从终端到图形界面
验证工具是locale命令和几个 small 的检测点,我按层级排好了:
- 终端环境验证:
echo $LANG输出 zh_CN.UTF-8。 - 第三方终端软件验证:打开 Xfce Terminal 或 GNOME Terminal,执行
locale,输出全部显示 zh_CN.UTF-8。 - 桌面组件验证:打开文件管理器,侧边栏的"Home"是否变成"主目录","Documents"是否变成"文档"。这里注意,某些预装的软件(比如海豚文件管理器)有自己的硬编码英文,不会跟随系统语言,这是软件本身的问题,不是你的配置错误。
- 软件输出验证:在终端执行
apt upgrade,会看到大量中文的 Updating 和 Reading 输出;执行man ls,帮助页面也应该显示中文。 - 日期与数字格式验证:打开终端执行
date,正常情况下应该输出类似"2025年06月18日 星期三 15时30分00秒 CST"的格式。如果日期还是英文 June 18 2025,说明 LC_TIME 未被正确设置,需要检查 LC_ALL 是否真的生效了。
5.2 回滚方法:改回英文也不过三行命令
如果你试了几天后觉得中文界面不好用,想回到英文,不要重装系统,按下面的顺序操作:
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANGUAGE=en_US:en然后删除/root/.bashrc里你手动追加的那几行 export,最后注销重新登录即可。整个过程不会影响系统里已经生成的 zh_CN.UTF-8 语言数据,只是让环境变量重新指向英文。
5.3 遗留问题:乱码条目、输入法与不完整翻译
最后说几个我在实测中遇到的遗留问题,避免你将来被误导。
第一,locale -a的输出里会同时存在zh_CN.utf8和zh_CN.UTF-8两种写法(小写和大写),这其实是同一个语言编码,不要因为看到两个就以为装重复了。
第二,Kali 的软件源里很多工具(尤其是渗透测试类工具,比如 metasploit、nmap)并没有完整的 zh_CN 翻译文件,所以即便系统切换成中文,这些工具的界面依然显示英文。这不是配置问题,是上游软件没有提供中文语言包。遇到这种情况,我的建议是把它当作正常现象,不必强行去改,因为强行汉化反而可能破坏工具的参数说明(本末倒置)。
第三,如果你需要输入中文,Kali 默认没有安装输入法框架。可以装 fcitx5:
apt install fcitx5 fcitx5-chinese-addons装完在系统设置里把输入法框架配置为 fcitx5,注销重新登录后按 Ctrl+Space 即可切换中英文输入。这一步和系统语言切换是相互独立的,很多人误以为切换语言后就能直接中文输入,其实不然。
6. 写在最后:别再为这个问题重装系统了
从我踩过这么多坑后的角度看,Kali 改中文这件事,最大的障碍其实是"命令太多、链路不清"。每个教程只讲其中一两步,又没说明操作基于什么前置条件,导致很多人把顺序搞反:先改环境变量,后发现没装 locales;先装字体,后发现语言没切换;用 su 而非 su - 测试环境变量,白白浪费大量时间。
我个人在实际操作中的切身感受是:把"生成语言包"和"设置环境变量"这两件事分开理解,问题就解决了一半。前者本质是让系统获得处理中文的能力,后者是告诉用户会话去使用这种能力。搞懂这个思维模型后,你在任何 Debian 系发行版上遇到类似问题都能举一反三,不用再依赖网络上的碎片化教程。也建议你在执行完本节操作、确认语言切换成功后,顺手把用过的命令记到自己的笔记里,下次重装系统时就能一只脚绕开我踩过的这些坑。