设置LC_ *但不设置LC_ALL


13

我想使用德语(奥地利)语言环境(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:这是一台共享计算机,我也不是很随便,因此不能更改系统范围的设置。

Answers:


15

共有三套语言环境设置¹:

  • LANG(即后备设置)(如果您尚未为类别指定值)。旨在使用户以一种简单的方式指示其语言环境。
  • LC_xxx为每个类别(xxx可以是MESSAGESTIME等)。
  • LC_ALL覆盖所有设置。这是应用程序覆盖所有设置以便在已知语言环境(通常C是默认语言环境)下工作的一种方式,通常这样,各种命令就会以已知格式产生输出。

因此,您可以设置LANG=de_AT.UTF-8LC_MESSAGES=CC是默认语言环境,表示未翻译;en_US通常与C消息相同)。

但是,我不建议更改默认类别,因为有两种类别,因为它破坏了很多程序:

  • LC_COLLATE是字符排序顺序。它不是很有用,因为它仅指示如何对字符进行排序,而不指示如何对字符串进行排序。不使用知道如何对字符串进行排序的工具LC_COLLATE。此外,许多工具都希望“ [a-z]与所有26个ASCII小写字母匹配,而没有其他ASCII字符匹配”之类的东西,但是在大多数非默认语言环境(try 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。如果您还没有听说过,那么您就不会错过太多。


感谢您的详细回答和解释!不过,我将尝试使用本地化的LC_NUMERIC,因为(不幸的是)德语键盘上的数字键盘,代替了数字键盘.,所以用点输入数字很不方便(大多数应用程序似乎可以很好地与非标准LC_NUMERIC配合使用)。我不完全理解您的LC_COLLATE示例:在我的系统上,您提供的示例匹配B
Heinzi


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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.