设置 LC_* 但不设置 LC_ALL

Hei*_*nzi 14 environment-variables locale

我想要一个德语(奥地利)语言环境(A4 纸张大小,24 小时制,yyyy-mm-dd),但是一个英语用户界面(我不喜欢糟糕的翻译)。我认为实现这一点的正确方法是LC_在我的.bashrc(如果我错了,请纠正我)中如下设置变量:

LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方法来设置 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"
Run Code Online (Sandbox Code Playgroud)

PS:这是一台共享机器,我不是 sudoer,所以更改系统范围的设置不是一种选择。

Gil*_*il' 16

共有三组区域设置¹:

  • LANG,回退设置,如果您尚未为类别指定值。它旨在让用户以简单的方式指示他们的语言环境。
  • LC_xxx为每个类别(xxx可以是MESSAGESTIME等)。
  • LC_ALL覆盖所有设置。这是应用程序覆盖所有设置以便在已知语言环境(通常C是默认语言环境)中工作的一种方式,通常是为了使各种命令以已知格式生成输出。

因此,您可以设置LANG=de_AT.UTF-8and 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_MESSAGESLC_TIMELC_PAPER、 加号LC_CTYPE(其值可能因您的终端而异))。

¹ 加上LANGUAGEGNU libc。如果你没有听说过它,你就不会错过太多。


Ric*_*rri 10

手册页区域(7)说:

默认语言环境[...]使用以下步骤确定:

  1. 如果存在非空环境变量 LC_ALL,则使用 LC_ALL 的值。

  2. 如果与上述类别 [LC_*] 之一同名的环境变量存在且非空,则将其值用于该类别。

  3. 如果存在非空环境变量 LANG,则使用 LANG 的值。

因此,您可以使用 LANG 作为 LC_ALL 的一种低优先级模拟:将 LANG 的值设置为de_ATLC_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"
Run Code Online (Sandbox Code Playgroud)