在我的 Linux 系统上,我更喜欢使用英语的用户界面。但是,作为德语母语人士,我需要拼写检查才能理解英语和德语。
昨天我了解到你可以使用LANGUAGE
环境变量来指定“语言优先列表”对于 GNU gettext,它将优先于LC_ALL
和LANG
。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 错误报告已经有了更多详细信息。