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)
mkl*_*nt0 12
如果您想按照 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]上的默认设置,即反映简单语言标签(例如,西班牙语)或语言区域标签(例如,德语的德国变体)的值的子字符串,您必须取消设置或覆盖才能使不同语言的消息生效。[3]LANG
es
de_DE
LANGUAGE
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
在本例中为 )。
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_MESSSAGES
和LANG
。指定无效/未安装的区域设置名称会导致回退到 POSIX 区域设置,因此回退到美国英语。
[1] Lekensteyn 的答案在没有取消设置/覆盖LANGUAGE
的情况下仍然有效的原因是一个例外:如果(有效)LC_MESSAGES
值(通常通过LANG
或间接设置LC_ALL
)是C
or (其同义词)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
确实(输出西班牙语错误消息)。
如果有人知道为什么以及是否有充分的理由,请告诉我们。
归档时间: |
|
查看次数: |
12760 次 |
最近记录: |