LANGUAGE 环境变量忽略“en”(英语)

LANGUAGE 环境变量忽略“en”(英语)

在我的 Linux 系统上,我更喜欢使用英语的用户界面。但是,作为德语母语人士,我需要拼写检查才能理解英语和德语。

昨天我了解到你可以使用LANGUAGE环境变量来指定“语言优先列表”对于 GNU gettext,它将优先于LC_ALLLANG。Signal 桌面应用程序用它来确定要使用哪些拼写检查词典

我已将环境变量设置为

LANG=en_US.UTF-8
LANGUAGE=en_US:en:de_DE:de

事实上,这使得我可以在 Signal 中同时使用英语和德语拼写。

但是,现在我的大多数系统实用程序对我来说都是德语!

$ cat ''
cat: '': Datei oder Verzeichnis nicht gefunden

我曾多次尝试修复此问题:

  • for l in en{,_US}{,.utf8,.UTF-8}:de; do echo $l; LANGUAGE="$l" cat ''; done(即以不同的方式指定英语区域设置)都讲德语。
  • LANGUAGE=fi:de讲芬兰语, 和en:fi:de也讲:fi:de
  • LANGUAGE=xy:en:de(首先无效的语言)说德语。
  • LANGUAGE=C:fi:de使用英语(!),而LANGUAGE=de:C:fi又是德语。

有趣的是,输出locale -a既不包含德语也不包含芬兰语:

$ locale -a
C
C.utf8
en_US.utf8
POSIX

LANG=C正如预期的那样,LANGUAGE完全禁用:

$ LANG=C cat ''
cat: '': No such file or directory

现在,我可以简单地编写一个仅为 Signal 设置的包装器LANGUAGE,并在我的正常环境中将其保持未设置状态,但这更像是一种解决方法,而不是真正的修复。我到底做错了什么?为什么不被en接受?C这真的是可行的方法吗?

这是一个 Debian 12(bookworm)系统。输出为locale

LANG=en_US.UTF-8
LANGUAGE=en_US:en:de_DE:de
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

答案1

显然,这里发生的事情是,大多数使用 gettext 的软件根本没有英语版本。相反,它们使用英语文本作为“消息 ID”(msgid),即查找键,如果用户请求一种没有翻译的语言,则会显示这些原始消息 ID。因此,开发人员根本不添加英语翻译,而是依靠 gettext 回退到消息 ID 来提供英语文本。

结果,由于没有英语翻译,en_US:en我的LANGUAGE设置部分与任何内容都不匹配,系统会恢复为德语。C在英语后面添加会使其恢复为“未翻译”(始终存在)而不是德语。但是,Signal(可能还有其他 Electron 应用程序)无法理解C“英语”的意思,并且设置C:de只会提供德语拼写检查,因此我仍然需要保留en它才能正常工作。 我已经确定en_US:en:C:de_DE:de在 gettext 和 Signal 中哪个能做正确的事情。

但从技术上讲,C消息 ID 可能不是英语,而是其他语言,而且显然没有办法告诉 gettext 它们是什么语言。2018 年的 GNU gettext 错误报告已经有了更多详细信息。

相关内容