当前位置: 首页>>技术教程>>正文


暂时更改终端消息/警告/错误的语言

, ,

问题描述

我的终端中的消息默认使用俄语显示,这是我的母语。

暂时我希望它们是英文的(例如粘贴到论坛中),然后切换回默认语言。

如何使用 bash 进行切换和切换回来?

最佳回答

有多个环境变量可用于更改语言设置。您可以通过执行 locale 命令来查看当前的区域设置。要将所有区域设置更改为英语,请使用 LANG=C 。此 C 语言环境始终可用,无需安装其他语言包。 (要暂时更改为非英语语言环境,请参阅 @mklement0 的帖子。)

例子:

使用默认语言设置执行命令并打印当前区域设置:

$ /nonexistent
bash: /nonexistent: Bestand of map bestaat niet
$ locale
LANG=nl_NL.UTF-8
LANGUAGE=
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=

暂时覆盖一个程序的语言并表明它确实是临时的:

$ LANG=C ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ ls /nonexistent
ls: kan geen toegang krijgen tot /nonexistent: Bestand of map bestaat niet

更改当前 shell 中执行的所有命令的区域设置并再次包含证明:

$ LANG=C
$ ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ locale
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

次佳回答

如果您想按照 OP 的要求按需切换到美国英语,Lekensteyn’s helpful answer 效果很好,但如果您想按需切换到其他语言,则需要更多工作。

在开始之前,您必须使用 sudo apt-get install language-pack-<lang-tag> 安装消息表,其中 <lang-tag>simple RTF 5646 language subtag ,例如西班牙语的 es

背景信息

基于 GNU gettext 的实用程序优先考虑非标准 LANGUAGE 环境变量[1]\n高于 POSIX-defined 区域设置环境变量 LC_ALLLC_MESSAGESLANG (按该顺序)。

鉴于 LANGUAGE 在 Ubuntu 系统上默认设置[2],即 LANG 值的子字符串,反映简单语言标签(例如,es 代表西班牙语)或 language-region 标签(例如,de_DE 代表德语的德国变体) ),您必须取消设置或覆盖 LANGUAGE 才能使不同语言的消息生效。[3]

选项 1:设置 LANGUAGE

示例:临时切换到西班牙语 (es) 消息:

$ LANGUAGE=es ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

注意:简单的语言标记(例如 es )就足够了,但您可以添加区域标识符(例如, es_AR 代表阿根廷),甚至字符集后缀(例如 es_AR.UTF-8 )。\n但是,本地化消息可能仅存在于语言级别,后备方法是使用与语言部分匹配的消息(在本例中为 es )。

选项 2:取消设置 LANGUAGE 并设置 LC_ALL

此替代解决方案首先取消定义 LANGUAGE,然后使用 POSIX 语言环境变量 LC_ALL 隐式设置 LC_MESSAGES [4]:

$ LANGUAGE= LC_ALL=es_ES.UTF-8 ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

该解决方案的优点是可以将所有本地化方面设置为指定的语言环境(例如用于日期/时间格式的 LC_TIME),并且通过(隐式)设置 LC_MESSAGES 还可以通知非 GNU 程序所需的语言。

请注意, LC_ALL 需要准确、完整的语言环境名称(包括字符集后缀)才能生效( es_ES.UTF-8 )(与 LANGUAGE 不同,简单的语言标记就足够了(如 es ))。这同样适用于设置 LC_MESSSAGESLANG 。指定无效/未安装的语言环境名称会导致回退到 POSIX 语言环境,从而回退到美国英语。


Footnotes

\n[1] 即使_没有_取消设置/覆盖 `LANGUAGE`,Lekensteyn 的答案也有效的原因是_例外_:如果(有效)`LC_MESSAGES`值(通常通过 `LANG` 或`LC_ALL`间接设置)是 `C` 或(其同义词)`POSIX` ,无论 `LANGUAGE` 的值(如果有)如何,该值都会受到尊重。相反,如果(有效)“LC_MESSAGES”值是任何其他_特定_区域设置,则 `LANGUAGE` 优先。\n

\n[2] 这适用于 [Ubuntu 本身](https://www.ubuntu.com/),但不一定适用于 [其他风格](https://www.ubuntu.com/about/about-ubuntu/flavors) ; Lekensteyn 指出 [Kubuntu](https://kubuntu.org/) _not_ 设置 `LANGUAGE`。 \n可以说,默认情况下不应设置 `LANGUAGE`,因为在缺少 `LANGUAGE` 的情况下,会考虑 `LANG` 值(确定当前区域设置)隐含的“LC_MESSAGES”值。\n

\n[3] 您还可以使用此方法通过指定“LANGUAGE=C”或“LANGUAGE=POSIX”(作为“LANG=C”/“LANG=POSIX”的替代)来切换到[美国]英语,尽管我不清楚这是否是主动识别的,或者只是一个 _fallback_ 机制,因为这些值不以 _language_ 标签开头;也许更好的选择是“en_US”。\n

\n[4] 有一个_edge_情况,这种方法不起作用:尝试使用_path_调用可执行文件 – 无论是相对路径还是绝对路径 – 都不会切换到指定的语言,而_仅文件名_会切换到指定语言:\n`LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utility` 不起作用(在当前语言环境中输出消息),而 \n`LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utility` 起作用(输出西班牙语错误消息) 。 \n如果有人知道原因以及是否有充分的理由,请告诉我们。\n

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14185.html,未经允许,请勿转载。