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

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

我想让它们用英语(例如粘贴在论坛中),然后切换回默认语言。

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

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

例子:

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

 $ /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的有用答案非常有用 ,但如果您想按需切换到其他语言, 则需要做更多工作。

在开始之前,必须使用sudo apt-get install language-pack-安装消息表,其中是一个简单的RTF 5646语言子标签 ,例如es表示西class牙语。

背景信息

基于GNU gettext的实用程序优先于非标准LANGUAGE环境变量[1]而不是POSIX定义的语言环境变量LC_ALLLC_MESSAGESLANGLC_MESSAGES顺序)。

鉴于在Ubuntu系统[2]上默认设置LANGUAGE ,即LANG值的子字符串 ,它反映简单的语言标记(例如,西class牙语为es )或语言区域标记(例如德国变体的de_DE德语),您必须取消设置或覆盖LANGUAGE才能使其他语言的消息生效。 [3]

选项1:设置LANGUAGE

示例 :ad-hoc切换到西class牙语消息:

 $ 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_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如何要求精确的完整语言环境名称(包括charset后缀)有效( es_ES.UTF-8 )(与LANGUAGE不同,简单语言标记就足够了(如es ))。 这同样适用于设置LC_MESSSAGESLANG 。 指定无效/未安装的区域设置名称会导致回退到POSIX区域设置,从而导致回退到美国英语。


脚注

[1] Lekensteyn的答案即使没有取消/覆盖LANGUAGE也能解决的原因是一个例外 :如果(有效) LC_MESSAGES值(通常通过LANGLC_ALL间接设置)是C或(其同义词) POSIX ,则该值得到尊重,不论LANGUAGE的价值如何,如果有的话。 相反,如果(有效) LC_MESSAGES值是任何其他特定区域设置,则LANGUAGE优先。

[2]这适用于Ubuntu ,但不一定适用于其他风格 ; Lekensteyn声称Kubuntu 没有设置LANGUAGE
可以说,默认情况下不应设置LANGUAGE ,因为在缺少LANGUAGELANG值隐含的LC_MESSAGES值(决定了当前的语言环境)得到了尊重。

[3]您也可以使用此方法切换到[US]英语,方法是指定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 (输出西class牙语错误消息)。
如果有人知道为什么以及是否有充分理由,请告诉我们。