DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Arch 用户 locale.conf 不生效:核对会话启动时的 LANG

Arch 用户 locale.conf 修改后桌面语言不变时,区分 locale 生成、当前环境和会话启动加载,核对 LANG 优先级及 xrdp 或显示管理器的实际入口。

Arch Linux 已在用户的 ~/.config/locale.conf 写入目标 LANG,登录 MATE 或经 xrdp 进入桌面后仍显示另一种语言。终端里临时重载配置能够改变 locale 输出,注销后却又恢复时,应检查会话启动过程是否真正载入用户设置,以及 LANG 是在哪一层被赋值的。

这条路径针对 Arch 的用户会话设置。其他发行版、显示管理器和远程桌面的启动规则可能不同;不能把修改某个历史 startwm.sh 的办法原样应用到全部系统。

可用 locale 与当前会话值是两件事

在发生问题的用户会话中检查:

locale -a
locale
localectl status

locale -a 列出可用 locale,不显示应用最终用了哪一个;locale 显示当前进程环境;localectl 主要反映系统设置,用户覆盖生效时,它不一定跟着改变。

目标 locale 不在可用列表中,又出现 Cannot set LC_MESSAGES 或类似提示时,先按 Arch 的生成流程检查 /etc/locale.gen,保留其他用户需要的条目,再生成已选择的 locale。只是把 LANG 写成一个字符串,不会生成系统所需的数据。修改系统生成列表需要管理权限,不能为个人语言偏好删掉全机其他 locale。

目标已经可用时,再检查当前 LANG、LC_MESSAGES、LC_ALL 和 LANGUAGE。LC_ALL 会覆盖 LANG 及各项 LC_*;gettext 翻译还可能受 LANGUAGE 的候选顺序影响。只改 LANG,未必能改变已经被更高优先级变量确定的消息语言。

用户文件由谁读取,不能只看它是否存在

Arch 的用户覆盖文件位于 $XDG_CONFIG_HOME/locale.conf,未另行设置 XDG_CONFIG_HOME 时通常就是 ~/.config/locale.conf。核对的是发生问题的远端用户账号,而不是本地连接电脑或另一个管理员账号的文件。

当前 Arch 的 /etc/profile.d/locale.sh 定义了读取优先级。已有 LANG 时,它不会重新从 locale.conf 更新设置。因此启动脚本先继承或写入系统 LANG,之后才读取 helper,可能与期待的用户覆盖不同。

先查看实际会话入口、profile 加载次序和后续赋值:LightDM 的会话包装脚本、xrdp 配置指定的启动脚本,以及用户 profile,未必走同一条路径。交互终端能读到用户设置,也不证明桌面进程启动前读过它。

当前上游 xrdp 示例脚本在多种启动分支中会调用读取 profile 的步骤;发行版又可能提供自己的脚本。不能直接断言 xrdp 从不加载 /etc/profile,也不要反复追加 source,让同一份初始化脚本执行多次。应找到实际没有加载、加载太晚或随后被覆盖的位置。

当前终端的重载,只影响后续启动的子进程

确认用户文件和所选 locale 正确,且需要在当前终端重新读取 Arch 配置时,可按其 helper 的规则使用:

unset LANG
source /etc/profile.d/locale.sh
locale

这里采用 Bash 的 source 写法,操作的是当前 shell。事先记录当前相关变量,确认不会破坏刻意设置的语言环境。LC_ALL 等优先项仍需按其来源检查;不要为了一个应用盲目清除全部 LC_* 变量。

此操作不会改变已经运行的桌面、编辑器或其他终端的环境。应从这个终端启动一个支持目标翻译的应用观察,再判断子进程是否继承正确设置。应用没有相应翻译资源、自己固定语言或连接已有后台进程时,界面可能仍不变。

从 locale.conf 删除某个变量,也不会自动清掉当前 shell 中原来已设置的同名变量。配置文件、已有环境和应用自身设置要分别核对,不能只以重载命令没有报错判断全部恢复。

持久修复放在实际会话启动入口

需要每次登录生效时,按当前发行版和会话的受支持机制,在桌面启动前载入正确用户环境,并去掉与用户覆盖冲突的重复赋值。只为一个用户修复,不应直接把全局系统语言改成他的偏好。

修改前保存用户 locale.conf、相关启动脚本及显示管理器或 xrdp 配置,保留可用的管理登录入口。在独立测试会话检查语法和加载次序,再重新建立用户会话;会话脚本写错可能导致登录后立即退出。不要通过重启整台多人服务器来判断个人语言设置。

不要把 LC_ALL 写进 locale.conf 作为永久覆盖,Arch 的该文件不支持这项用途。也不要为引入语言设置整份替换 xrdp 或桌面启动脚本,丢掉原来的 PAM、桌面选择和环境初始化步骤。

验收是在新建会话里,相关变量符合该用户选择,目标应用在有翻译资源的前提下使用正确语言,其他用户和系统日志环境保持原设计。当前终端的一次 locale 输出正确,并不等于下次登录会继续正确。

需要回退时恢复这一组用户配置和启动改动,再建立新会话检查。已启动进程仍保留旧环境,撤回文件不能把它们即时改回;按应用或会话生命周期处理即可。