我想要一个德语(奥地利)语言环境(A4 纸张大小,24 小时时间,yyyy-mm-dd),但有英语用户界面(我不喜欢糟糕的翻译)。我认为实现此目的的正确方法是LC_
在我的中设置变量如下.bashrc
(如果我错了,请纠正我):
LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8
有没有一种更优雅的方法来设置 LC_$everythingelse 而不是设置每个值?设置 LC_ALL 不是一个选项,因为它优先于 LC_MESSAGES:
$ export LC_ALL=de_AT.UTF_8
$ export LC_MESSAGES=en_US.UTF_8
$ echo $LC_MESSAGES
en_US.UTF_8
$ locale | grep LC_MESSAGES
LC_MESSAGES="de_AT.UTF_8"
PS:这是一台共享计算机,而且我不是 sudoer,因此无法更改系统范围的设置。
答案1
共有三组区域设置1:
LANG
,后备设置(如果您尚未指定类别的值)。它旨在让用户以简单的方式指示他们的区域设置。LC_xxx
对于每个类别(xxx
可以是MESSAGES
、TIME
等)。LC_ALL
覆盖所有设置。这是应用程序覆盖所有设置以便在已知区域设置(通常C
是默认区域设置)中工作的一种方式,通常以便各种命令以已知格式生成输出。
因此,您可以设置LANG=de_AT.UTF-8
and LC_MESSAGES=C
(C
是默认区域设置,表示未翻译;en_US
通常与C
消息相同)。
但是,有两类我不建议更改默认值,因为它会破坏很多程序:
LC_COLLATE
是角色整理命令。它不是很有用,因为它只指示如何对字符进行排序,而不是如何对字符串进行排序。知道如何对字符串进行排序的工具不使用LC_COLLATE
.此外,许多工具期望诸如“[a-z]
匹配所有 26 个 ASCII 小写字母且不匹配其他 ASCII 字符”之类的内容,但在大多数非默认语言环境中情况并非如此(尝试echo B | LC_COLLATE=en_US grep '[a-z]'
)。LC_NUMERIC
指示如何显示数字。特别是,在许多语言中,它使浮点数使用 a,
而不是.
作为小数点。但大多数解析数字的程序都需要 a.
并将 a,
视为字段分隔符。
所以我建议
- 要么明确地
LC_COLLATE=C LC_NUMERIC=_C
, - 或者保留
LANG
未设置状态,只为有用的类别设置一个值(LC_MESSAGES
、LC_TIME
、LC_PAPER
加号LC_CTYPE
(其值可能因您的终端而异))。
1
加号LANGUAGE
与 GNU libc。如果您没有听说过,您也不会错过太多。
答案2
这手册页区域设置(7)说:
默认语言环境[...]使用以下步骤确定:
如果存在非空环境变量 LC_ALL,则使用 LC_ALL 的值。
如果与上述类别 [LC_*] 之一同名的环境变量存在且非空,则其值用于该类别。
如果存在非空环境变量 LANG,则使用 LANG 的值。
因此,您可以使用 LANG 作为 LC_ALL 的一种低优先级类似物:将 LANG 的值设置为 ,de_AT
将 LC_MESSAGES 设置为en_US
:
$ env LC_MESSAGES=en_US.UTF-8 LANG=de_AT.UTF-8 locale | egrep '(MESSAGES|PAPER)'
LC_MESSAGES=en_US.UTF-8
LC_PAPER="de_AT.UTF-8"