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

tak*_*hin 25 command-line language locale

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

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

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

Lek*_*eyn 25

有几个环境变量可用于更改语言设置。您可以通过执行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=
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

更改在当前 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=
Run Code Online (Sandbox Code Playgroud)

  • 对于其他用户无法使用它时 - 设置`LANG` 或`LANG_ALL` 对我不起作用,但`LANGUAGE` 是。请参阅 [为什么覆盖 LANG 环境变量不会改变我的语言?](http://askubuntu.com/q/311767/88802) (6认同)

mkl*_*nt0 12

如果您想按照 OP 的要求按需切换到美国英语Lekensteyn 的有用答案非常有用,但是如果您想按需切换到不同的语言,则需要做更多的工作。

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

背景资料

基于GNU gettext的实用程序使非标准LANGUAGE环境变量[1]优先于 POSIX 定义的语言环境环境变量LC_ALLLC_MESSAGES、 和LANG(按此顺序)。

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

选项 1:设置 LANGUAGE

示例:切换到西班牙语 ( es) 消息即席:

$ LANGUAGE=es ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio
Run Code Online (Sandbox Code Playgroud)

注意:一个简单的语言标签,例如,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
Run Code Online (Sandbox Code Playgroud)

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

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


脚注

[1] Lekensteyn 的答案在没有取消设置/覆盖LANGUAGE情况仍然有效的原因是一个例外:如果(有效)LC_MESSAGES值(通常通过LANG或间接设置LC_ALL)是Cor (其同义词)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确实(输出西班牙语错误消息)。
如果有人知道为什么以及是否有充分的理由,请告诉我们。