问题描述
我的终端中的消息默认使用俄语显示,这是我的母语。
暂时我希望它们是英文的(例如粘贴到论坛中),然后切换回默认语言。
如何使用 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_ALL
、 LC_MESSAGES
和 LANG
(按该顺序)。
鉴于 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_MESSSAGES
和 LANG
。指定无效/未安装的语言环境名称会导致回退到 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