Answers:
有几个环境变量可用于更改语言设置。您可以通过执行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=
LANGUAGE
是一个例外:GNU gettext赋予该LANGUAGE
值优先级,除非(有效)LC_MESSAGES
值(通常通过LANG
或间接设置LC_ALL
)是C
或者(或其同义词)POSIX
。另请注意,LANGUAGE
此答案恰好未设置,但默认情况下已设置,并且如果已设置,则必须覆盖它以切换到特定语言环境的语言(与“ C” /“ POSIX”相对)你发现了什么。
LANGUAGE
明确设置或覆盖,否则您的答案在其他语言环境中将不起作用。给定问题的通用标题,人们很可能也会在寻求切换到非英语语言的同时找到此答案,因此请考虑将此信息添加到您的答案中。
LANGUAGE
:)
LANGUAGE
示例输出中的值更改为nl
,这是您的语言环境为时的实际默认值nl_NL.UTF-8
。
如果您想按OP的要求按需切换到美国英语,Lekensteyn的有用答案非常有用,但是如果您想按需切换到其他语言,则需要做更多的工作。
开始之前,您必须使用来安装消息表sudo apt-get install language-pack-<lang-tag>
,其中<lang-tag>
是一个简单的RTF 5646语言子标记,例如es
西班牙语。
GNU Gettext的基于效用的非标准给予优先级LANGUAGE
的环境变量[1]
在POSIX定义的语言环境变量LC_ALL
,LC_MESSAGES
和LANG
(按该顺序)。
假设LANGUAGE
在Ubuntu系统上默认设置了[2],即设置为该值的子字符串,该子字符串LANG
可以反映简单的语言标签(例如,es
西班牙语)或语言区域标签(例如,de_DE
德语的German变体),您必须取消设置或覆盖LANGUAGE
才能使另一种语言的消息生效。[3]
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
在这种情况下为)。
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
的值(通常设定间接地通过LANG
或LC_ALL
)或者是C
或(它的同义词)POSIX
,该值被推崇,的值无关LANGUAGE
,如果有的话。相反,如果(有效)LC_MESSAGES
值是任何其他特定语言环境,LANGUAGE
则优先。
[2]这适用于Ubuntu适当版本,但不一定适用于其他版本;Lekensteyn指出的Kubuntu也没有设置LANGUAGE
。
可以说,LANGUAGE
应该不被默认设置,因为其在不存在LC_MESSAGES
由所述隐含值LANG
值(其确定当前区域),被推崇。
[3]您也可以通过分配LANGUAGE=C
或LANGUAGE=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
(输出西班牙语错误消息)。
如果有人知道为什么以及是否有充分的理由,请告诉我们。
LANG
或LANG_ALL
对我不起作用,但LANGUAGE
确实如此。请参阅为什么覆盖LANG环境变量不会为我更改语言?