装好Ubuntu之后的第一件事,对很多人来说是切中文界面。我知道你们习惯在系统设置里点几下Language,选“简体中文”拖到第一位,重启完事。但如果你碰到的是Ubuntu Server、WSL、精简桌面环境,或者图形设置界面里根本没有语言项,你就必须掌握终端这种“第二种方法”。我最早接触终端设置中文,是因为帮朋友调一台只剩SSH能进的机器,图形界面完全起不来,只能用命令把locale配好。这套方法看起来就是几条命令的事,但里面牵扯到locale、语言包、字体这些底层逻辑,搞清楚之后,你会觉得系统语言切换其实一点也不神秘。
1. 为什么需要掌握终端设置中文这种“第二种方法”
1.1 图形界面方式为什么有时候行不通
桌面版Ubuntu的图形设置里,确实有Language选项,正常点几下就能把界面变成中文。但很多人照着教程做完,重启后还是满屏英文,或者菜单变成“半中半英”的状态。这通常是因为图形工具只改了当前用户的环境变量,没有真正把系统级别的locale刷新掉。还有一类更常见的情况:你装的是Ubuntu Server版,没有GNOME设置面板;或者你用的是WSL、Docker容器、云主机,压根没有桌面,这时候图形方式直接失效。
如果你在虚拟机里装了Ubuntu,想省内存用着轻量桌面比如Xfce、LXQt,这些桌面的语言设置入口藏得深,有的干脆没有。我见过不少人在Xfce里翻遍了“设置”也找不到语言选项,最后只能回到终端敲命令。所以终端方式不是“备胎”,而是绕开图形层、直达系统底层的正路。
1.2 终端方式背后的秘密:locale到底是个啥
要说清楚终端设置中文,就必须先弄明白locale这个概念。locale是Linux系统里控制语言、字符编码、时间日期格式、数字格式、货币符号等一组环境变量的统称。它由几个关键变量组成:LANG、LC_CTYPE、LC_TIME、LC_NUMERIC、LC_MONETARY、LC_COLLATE、LC_MESSAGES、LC_ALL等。其中LANG是总开关,其他LC_*是对某一类行为的具体控制。如果LC_ALL被设置了,它会强制覆盖所有其他locale设置,优先级最高。
可以这样理解:LANG=zh_CN.UTF-8,就是告诉系统“界面语言用中文,字符编码用UTF-8”。中文命令行的帮助信息、系统日志、软件菜单、日期显示,全看这个变量。终端设置中文的实质,就是往系统里安装中文本地化数据,然后让locale变量指向中文。明白了这层原理,很多奇怪问题(比如只改了一半、重启失效)就都好解释了。
1.3 哪些场景必须用到终端方案
我复盘下来,下面几类情况特别适合或者说必须用终端方式设置中文:
- 无图形桌面的服务器/容器环境:Ubuntu Server、Docker容器、WSL,想看到中文系统提示和中文man帮助,只能用终端。
- 图形设置失效或界面不完整:有些桌面环境或精简安装,没有语言设置入口,或者改了不生效。
- 批量运维和自动化配置:几十台机器要统一改成中文环境,手点图形界面显然不现实,写脚本批量执行才是正经办法。
- 排查语言相关故障:系统日志显示“cannot set locale”,你需要手动检查与修复locale,这本身就是一个终端活儿。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实操准备:确认环境、更新源、装对语言包
2.1 先确认Ubuntu版本和桌面环境
这一步很多人会跳过,但我强烈建议你执行一下,因为不同版本、不同桌面环境,后续安装包的选择会略有差异。打开终端,依次执行:
bash复制cat /etc/os-release
echo $XDG_CURRENT_DESKTOP
whoami
第一条看系统版本和代号,第二条看当前桌面环境(GNOME、XFCE、KDE等),第三条确认当前用户有没有sudo权限。需要注意的是,XDG_CURRENT_DESKTOP在当前SSH会话里可能为空,没关系,桌面版一般直接看系统设置里也能看出来。
我遇到过最典型的翻车案例:朋友在Ubuntu 24.04上安装语言包时,误装了一个给老版本用的包,导致apt报依赖错误。所以先确认版本再动手,能省很多麻烦。
2.2 更新软件源索引,避免装包失败
安装语言包之前,建议先更新软件包索引。很多刚装好的镜像,软件源是旧的,直接apt install可能会报“找不到软件包”或者下载失败。执行:
bash复制sudo apt update
这一步会去Ubuntu软件源拉取最新的包列表。如果你用的是慢速网络或者镜像源、内网源,这一步耗时可能比较长,但通常不会失败。如果apt update报错,先检查网络连通性和源配置(/etc/apt/sources.list或/etc/apt/sources.list.d/下的文件),再继续。这一步不做干净,后面装语言包极可能卡在依赖上。
2.3 安装中文语言包:zh-hans和gnome-zh-hans有区别
Ubuntu的中文本地化数据是由语言包管理的,核心包名叫language-pack-zh-hans。如果你是桌面版,我建议顺手把GNOME语言支持包也装上:
bash复制sudo apt install -y language-pack-zh-hans language-pack-gnome-zh-hans
这里解释一下区别:language-pack-zh-hans是中文简体语言包的核心,包含locale数据、翻译文件、字符集定义;language-pack-gnome-zh-hans则额外包含GNOME桌面组件的翻译资源,像文件管理器、设置面板、软件商店这些界面文案的汉化都靠它。只装前者,桌面菜单可能有一大半还是英文。
安装包大小一般在几十MB到一百多MB,取决于网络速度。装的过程中如果提示“universe仓库未启用”,通常是因为使用了精简sources.list,需要先确认universe组件开启。这条可以说是桌面版中文化的第一块地基。
2.4 顺手装中文字体,避免中文显示成方块
语言包解决的是“翻译”问题,字体解决的是“显示”问题。很多人改成中文后看到满屏“□□□□□”,第一反应是locale没生效,其实多半是中文字体缺失。在纯命令行终端里,字体由终端模拟器(如GNOME Terminal、Windows Terminal)决定;在桌面环境里,系统需要有一套中文字体来渲染界面文字。
建议安装Noto CJK字体,这是Google和Adobe联合开发的开源中文字体,也是目前Linux桌面兼容性最好的选择:
bash复制sudo apt install -y fonts-noto-cjk
fonts-noto-cjk包含简体中文、繁体中文、日文、韩文的常用字形,覆盖日常使用完全够。如果你对字形有较高要求,还可以装fonts-noto-cjk-extra,体积更大但字体更全。字体装完不需要重启,重新登录一次或者等字体缓存刷新就能生效。
这里有个经验:在WSL里,终端字体是Windows侧渲染的,装不装中文字体关系不大,只要Windows上有中文字体就行;但如果你在WSL里跑图形程序,比如用VcXsrv或WSLg跑GUI应用,那WSL系统里最好还是装上中文字体。
3. 核心配置:生成locale、设置变量、让中文真正生效
3.1 先看看当前locale长什么样
装完语言包,先别急着改配置,看一眼当前环境到底处于什么状态。执行:
bash复制locale
locale -a
locale输出当前生效的locale变量,locale -a列出系统里当前可用的所有locale。如果locale输出里大部分都是LANG=en_US.UTF-8或C.UTF-8,而且locale -a里面找不到zh_CN.utf8相关条目,说明中文本地化数据还没有被真正注册到系统里。这时候只是装了语言包,还没生成对应的locale,不生效是正常的。
我见过有人在这个环节就慌了,以为系统坏了。其实这一步就是“检查”,不是“修复”。你把locale想象成一本本翻译字典,系统先要有字典(语言包),再把字典登记在书架上(locale数据),最后告诉程序去翻哪本(环境变量)。现在字典有了,书架还没登记。
3.2 生成中文locale:locale-gen命令怎么用
接下来是关键一步:生成中文locale数据。Linux下生成locale的方式有两种,效果等价,选一个用就行。
第一种,直接指定名字生成:
bash复制sudo locale-gen zh_CN.UTF-8
第二种,先编辑/etc/locale.gen,把zh_CN.UTF-8 UTF-8这一行前面的注释符号去掉,然后执行:
bash复制sudo locale-gen
第二种方式的优点是以后需要多个locale时可以一次性生成。比如你既想要中文又想要英文,/etc/locale.gen里把这两行都放开,执行一次locale-gen就都生成了。生成过程正常情况几秒到几十秒,结束后可以再次执行locale -a确认zh_CN.utf8已经出现在列表里。
这里提醒一个容易踩的坑:locale-gen的输出里如果出现类似“Cannot set LC_CTYPE to default locale”的提示,说明当前shell环境的locale配置已经混乱了,但生成结果可能仍然是成功的。先继续往下走,等update-locale改完默认值,重新登录后这个警告一般会自动消失。
3.3 设置默认locale:update-locale才是总开关
生成locale后,还需要告诉系统“以后默认用中文”。修改系统级默认locale有两种方式,推荐用update-locale这个专门命令,原因很简单:它会自动帮我们处理配置文件的格式,还带有安全校验。
bash复制sudo update-locale LANG=zh_CN.UTF-8
这条命令会修改/etc/default/locale文件,写一行LANG=zh_CN.UTF-8。如果你还想让日期、数字、排序等也跟着中文化,可以再追加设置一下:
bash复制sudo update-locale LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh
LANGUAGE是给某些GNU gettext程序看的语言偏好列表,值为zh_CN:zh表示优先使用简体中文,找不到翻译再退回中文通用区域。桌面版建议同时设置这两个变量,可以避免一部分软件界面依然显示英文的情况。
如果你想建立一个纯粹的中文环境,可以再设置:
bash复制sudo update-locale LC_ALL=zh_CN.UTF-8
但我不建议在生产环境里把LC_ALL钉死,因为它会覆盖一切locale变量,导致后续排查问题时没法单独切换语言。在自己日常用的桌面机上,LANG和LANGUAGE就足够了。
3.4 验证配置、重启或注销
配置改完之后,光在终端里执行source /etc/default/locale是没用的,因为它只会改变当前shell进程的环境变量,桌面环境、系统服务、GNOME Shell都还保留着旧配置。真正干净的做法是注销重新登录,或者直接重启:
bash复制sudo reboot
重启完成后,先别急着开心,依次验证几个关键点:
bash复制locale
echo $LANG
date
locale应该显示中文相关的变量,$LANG应该是zh_CN.UTF-8,date输出里月份、星期应该变成中文。如果你是桌面版,这时候打开设置面板,语言一栏应该显示简体中文排在第一位;文件管理器的菜单、右键菜单应该已经是中文。
有一个细节:如果你只用SSH远程连接这台机器,而远端终端软件本身不支持中文显示(或者字体不对),那你看到的中文可能仍是乱码。这不是Linux的问题,要检查SSH客户端(如Windows Terminal、Tabby)的编码设置和字体。比如Windows自带的旧版控制台就很容易乱码,建议换成Windows Terminal或Tabby这类现代终端工具。
4. 关联配置:中文输入法、终端乱码、WSL场景补充
4.1 装完中文界面,还得有中文输入法
界面变中文之后,很多人马上会问:为什么没法打中文?这是两个层面的问题——界面语言和输入法框架,它们是独立的。Ubuntu桌面版默认自带IBus输入法框架,一般装完中文语言包之后,在设置的通知栏区域会多出输入源选项,你可以添加“汉语(Intelligent Pinyin)”。如果这里没出现,先在终端安装输入法:
bash复制sudo apt install -y ibus-libpinyin
然后到“设置—键盘—输入源”里添加中文拼音。用下来感觉IBus的智能拼音只能说中规中矩。对打字体验要求高的,我更推荐切换成Fcitx 5,这也是目前Linux桌面圈最主流的方案:
bash复制sudo apt install -y fcitx5 fcitx5-chinese-addons
im-config -n fcitx5
装完注销重新登录,按Ctrl+Space就能切换出拼音。提醒一下,im-config -n fcitx5这条命令会修改用户级输入法框架配置,如果不执行,桌面可能还是默认走IBus,导致装了Fcitx却用不上。在Ubuntu 22.04及之后版本上,Fcitx 5和GNOME的兼容性已经很好,没那么多毛病。
4.2 终端里中文乱码的三种原因
改成中文后,偶尔会在终端里看到乱码。我排过几次,总结下来原因无非三类:
第一类是终端模拟器的编码问题。按下Ctrl+Shift+C复制的内容粘贴后乱码,或者直接显示“锟斤拷”,多半是会话编码不是UTF-8。现代终端默认UTF-8,较多遇到的是旧版本Xshell、SecureCRT,把这几个工具里的编码手动改成UTF-8就行。
第二类是系统locale没生效。比如locale命令显示LANG还是en_US.UTF-8,中文内容用错误编码解析自然乱码。解决方案回到第3.2节、第3.3节,重新生成并设置locale。
第三类是软件自身的字符集问题。有些老程序(比如部分基于GTK2的老软件)在纯中文locale下反而显示异常,这时可以单独给某个程序指定英文环境运行:
bash复制LANG=en_US.UTF-8 some_old_application
这是临时方案,不影响系统其他部分。
4.3 WSL和Ubuntu Server场景的特别提醒
WSL里设置中文的步骤和正常Ubuntu几乎一样,安装语言包、生成locale、update-locale三步走。区别在于,WSL没有图形登录管理器,改完locale后需要关掉WSL窗口重开,或者执行wsl --shutdown后重新进入,让新locale生效。
Ubuntu Server场景我则要泼一盆冷水:如果你跑的是生产服务器,我的建议是不要改成中文。原因很简单——服务器日志、系统消息、软件报错大多是英文,网上搜解决资料时英文原文更利于排查;而且有些程序会比较“耿直”,locale设置得不全,反而触发兼容性警告。如果你只是自己开发用的服务器,改中文图个舒服,没问题,但请记住同时保留一个备用英文Shell。
5. 常见问题与排查技巧实录
5.1 一张表搞定高频故障
我把自己和网友踩过的高频问题整理成表格,按“先检查最可能的项”原则排了序,方便你按图索骥。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 重启后界面还是英文 | update-locale没执行,或~/.bashrc、~/.profile里覆盖了LANG |
重新执行sudo update-locale LANG=zh_CN.UTF-8;检查用户级启动文件里是否有export LANG=en_US... |
| 中文显示成方块 | 中文字体缺失 | sudo apt install fonts-noto-cjk,重新登录 |
| SSH终端中文乱码 | 终端软件编码不是UTF-8 | 将SSH客户端编码改为UTF-8,或用Windows Terminal/Tabby |
| locale命令报“cannot set locale” | locale数据缺失、环境变量指向了不存在的locale | 执行locale -a确认有无zh_CN;没有就sudo locale-gen zh_CN.UTF-8 |
| 系统日志里秒变中文但软件还是英文 | 缺少软件对应语言包或LANGUAGE未设置 | 安装language-pack-gnome-zh-hans,并设置LANGUAGE=zh_CN:zh |
| root是中文,普通用户是英文 | 用户级环境变量覆盖了系统默认值 | 检查该用户~/.bashrc、~/.profile、~/.pam_environment里的LANG设置 |
5.2 排查顺口溜与独家经验
这里分享两个排查经验。一是“改完重启前先看三个文件”:/etc/default/locale、~/.bashrc、~/.profile。系统级默认配置在第一个文件里;用户级覆盖配置可能藏身于后两个文件。90%的“重启不生效”问题,都出在这三个文件的打架上。
二是“重启后先看一个命令”:locale。它的输出如果依然挂着en_US,不要急着重装系统,先检查用户级环境变量。我遇到过一台机器怎么改都是英文,最后发现是用户在~/.profile里写了一句export LANG=C,那是他当年用来规避某个软件报错加的,时间久了忘得一干二净。
另外,很多人不知道dpkg-reconfigure locales这个命令:
bash复制sudo dpkg-reconfigure locales
它会弹出对话框,让你用空格键勾选需要生成的locale,选完自动执行locale-gen并更新配置。在Debian系系统里,这也是一条能救急的命令,尤其当你把locale文件搞乱时,它相当于官方恢复向导。
5.3 一条安全的“后悔药”
如果你设置完觉得中文环境不适合自己,想切回英文,终端里执行:
bash复制sudo update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en
然后重启即可。这就是掌握终端方案的最大好处——随时可以翻转回去,不需要重新装系统。顺便说一句,如果你打算之后反复切换语言,建议在/etc/locale.gen里同时保留en_US.UTF-8和zh_CN.UTF-8两行,别只留中文,省得以后切回英文时还得再生成一次locale。
我的习惯是,每次装完Ubuntu后,先用终端把language-pack-zh-hans和fonts-noto-cjk装上,然后把zh_CN.UTF-8和en_US.UTF-8同时生成好。日常使用中文界面,排查问题时临时把某个SSH会话切到英文环境,两边互不干扰。这套做法在好几台桌面机、虚拟机、WSL上反复验证过,稳得很。希望这篇终端设置中文的完整记录,也能一次帮你把Ubuntu的中文环境配置得明明白白。
