设置 LC_* 但不设置 LC_ALL

设置 LC_* 但不设置 LC_ALL

我想要一个德语(奥地利)语言环境(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可以是MESSAGESTIME等)。
  • LC_ALL覆盖所有设置。这是应用程序覆盖所有设置以便在已知区域设置(通常C是默认区域设置)中工作的一种方式,通常以便各种命令以已知格式生成输出。

因此,您可以设置LANG=de_AT.UTF-8and LC_MESSAGES=CC是默认区域设置,表示未翻译;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(其值可能因您的终端而异))。

1 加号LANGUAGE与 GNU libc。如果您没有听说过,您也不会错过太多。

答案2

手册页区域设置(7)说:

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

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

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

  3. 如果存在非空环境变量 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"

相关内容