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


22

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

请稍等一会,我希望它们使用英语(例如,粘贴在论坛中),然后切换回默认语言。

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

Answers:


23

有几个环境变量可用于更改语言设置。您可以通过执行locale命令来查看当前的语言环境设置。要将所有语言环境设置更改为英语,请使用LANG=CC无需安装其他语言包,该语言环境始终可用。(为了临时更改为非英语语言环境,请参阅@ 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=

6
对于其他无法使用此功能的用户-设置LANGLANG_ALL对我不起作用,但LANGUAGE确实如此。请参阅为什么覆盖LANG环境变量不会为我更改语言?
gertvdijk

1
@gertvdijk:谢谢你。即使没有设置,此答案仍然有效的原因LANGUAGE是一个例外:GNU gettext赋予该LANGUAGE值优先级,除非(有效)LC_MESSAGES值(通常通过LANG或间接设置LC_ALL)是C或者(或其​​同义词)POSIX。另请注意,LANGUAGE此答案恰好未设置,但默认情况下设置,并且如果已设置,则必须覆盖以切换到特定语言环境的语言(与“ C” /“ POSIX”相对)你发现了什么。
mklement0 '16

切换到“ C”语言环境(带有要求的美国英语消息)时,您的答案非常有用,但除非LANGUAGE明确设置或覆盖,否则您的答案在其他语言环境中将不起作用。给定问题的通用标题,人们很可能也会在寻求切换到非英语语言的同时找到此答案,因此请考虑将此信息添加到您的答案中。
mklement0'1/

@ mklement0给定问题的上下文(发布英语错误消息),我认为当前的帖子就足够了。您可以添加另一个答案来解释周围的详细信息LANGUAGE:)
Lekensteyn

正如您的建议,我已经添加了自己的答案。如果您同意我的评估,即将来的读者可能会来这里寻求改用任何一种语言(因为已经有人积极表示),请在我对您的问题的回答中添加一个链接。除此之外,我建议将LANGUAGE示例输出中的值更改为nl,这是您的语言环境为时的实际默认值nl_NL.UTF-8
mklement0 '16

9

如果您想按OP的要求按需切换到美国英语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德语的German变体),您必须取消设置或覆盖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_MESSSAGES和相同LANG。指定无效/未安装的语言环境名称会导致回退到POSIX语言环境,因此会回退到美国英语。


脚注

[1] Lekensteyn的回答作品甚至原因而不注销/重写LANGUAGE是一个例外:如果(有效)LC_MESSAGES的值(通常设定间接地通过LANGLC_ALL)或者是C或(它的同义词)POSIX,该值被推崇,的值无关LANGUAGE,如果有的话。相反,如果(有效)LC_MESSAGES值是任何其他特定语言环境,LANGUAGE则优先。

[2]这适用于Ubuntu适当版本,但不一定适用于其他版本;Lekensteyn指出的Kubuntu没有设置LANGUAGE
可以说,LANGUAGE应该被默认设置,因为其在不存在LC_MESSAGES由所述隐含值LANG值(其确定当前区域),被推崇。

[3]您也可以通过分配LANGUAGE=CLANGUAGE=POSIX(作为LANG=C/ 的替代方法)来使用这种方法来切换为[美国]英语LANG=POSIX,尽管由于这些值不知道是主动识别还是后备机制,我尚不清楚不是从语言标签开始的;也许更好的选择是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(输出西班牙语错误消息)。
如果有人知道为什么以及是否有充分的理由,请告诉我们。


向@ wjandrea表示感谢,以帮助他构建这篇文章。
mklement0 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.