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

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

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

我只是想让它们变成英文(例如粘贴到论坛中),然后切换回默认语言。

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

答案1

有多个环境变量可用于更改语言设置。您可以通过执行命令来查看当前的语言环境设置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=

答案2

Lekensteyn 的有用答案如果你想切换到美式英语按照原帖的要求,但是如果你想切换到不同的按需语言,还需要做更多的工作。

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

背景信息

GNU gettext基于的实用程序优先于非标准LANGUAGE环境变量[1] , 而不是 POSIX 定义的区域设置环境变量LC_ALLLC_MESSAGESLANG(按此顺序)。

鉴于LANGUAGE在 Ubuntu 系统上默认设置为[2],即子字符串LANG反映简单语言标记(例如,es西班牙语)或语言区域标记(例如,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)。
但是,本地化消息可能仅存在于语言级别,而后备方法是使用与语言部分(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 区域设置,因此会回退到美国英语。


脚注

[1] Lekensteyn 的答案即使不取消设置/覆盖 `LANGUAGE` 也能起作用的原因是例外:如果(有效)`LC_MESSAGES` 值(通常通过 `LANG` 或 `LC_ALL` 间接设置)是 `C` 或(其同义词)`POSIX`,则无论 `LANGUAGE` 的值如何(如果有),都会尊重该值。相反,如果(有效)`LC_MESSAGES` 值是任何其他特定语言环境,则 `LANGUAGE` 优先。 [2] 这适用于 [Ubuntu 本身](https://www.ubuntu.com/),但不一定适用于 [其他风格](https://www.ubuntu.com/about/about-ubuntu/flavours);Lekensteyn 指出 [Kubuntu](https://kubuntu.org/) 不会设置 `LANGUAGE`。可以说,`LANGUAGE` 不应被默认设置,因为如果没有设置 `LANGUAGE`,则 `LANG` 值(确定当前语言环境)所暗示的 `LC_MESSAGES` 值将受到尊重。 [3] 您还可以使用此方法通过分配 `LANGUAGE=C` 或 `LANGUAGE=POSIX`(作为 `LANG=C` / `LANG=POSIX` 的替代)切换到 [美国] 英语,但我不清楚这是否被主动识别或仅仅是一种 _fallback_ 机制,因为这些值不是以 _language_ 标签开头;也许更好的选择是 `en_US`。 [4] 有一种极端情况,这种方法不起作用:尝试使用路径调用可执行文件(无论是相对路径还是绝对路径)不会切换到指定语言,而仅使用文件名却可以:`LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utility` 不起作用(输出当前语言环境中的消息),而 `LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utility` 起作用(输出西班牙语错误消息)。如果有人知道原因以及是否有充分的理由,请告诉我们。

相关内容