似乎某些程序同时使用 LANG 和 LANGUAGE 环境变量来确定其用户界面语言。
这些变量的确切语义是什么?在哪里可以阅读有关它们的正确用法的信息?locale(1) 的手册页仅提到了 LC_* 系列环境变量。此外,还有一个常用的 LC_ALL 变量,但也没有在此处描述。
答案1
LANG
包含所有未由LC_*
变量直接设置的类别的设置。
LC_ALL
用于覆盖每个LC_*
和LANG
和LANGUAGE
。它不应该在普通用户环境中设置,但在编写依赖于国际化命令的精确输出的脚本时很有用。
LANGUAGE
用于将消息语言(如LC_MESSAGES
)设置为多值,例如,将其设置为fr:de:en
将使用法语消息(如果存在);如果不存在,它将使用德语消息,如果德语或法语消息都不可用,它将恢复为英语。
答案2
看一下手册页locale(7)
:它描述了LANG
后备设置,同时LC_ALL
覆盖了所有单独的LC_*
设置。
答案3
答案4
本回答尽量直接引用相关标准,不包含任何猜测或不准确的陈述。欢迎编辑和更正,只要引用相关标准和权威来源即可。
环境变量优先级
根据适用标准,所有四个变量LC_ALL
、LC_*
、LANG
和的优先级为:LANGUAGE
man 7 local
:
如果 setlocale(3) 的第二个参数是空字符串“”,则对于默认语言环境,使用以下步骤确定:
如果存在非空环境变量 LC_ALL,则使用 LC_ALL 的值。
如果存在与上述类别之一同名的环境变量且非空,则其值将用于该类别。
如果存在非空环境变量 LANG,则使用 LANG 的值。
当程序查找与语言环境相关的值时,它会按照以下环境变量的优先级顺序进行查找:
- 语言
- LC_全部
- LC_xxx,根据所选的区域设置类别:LC_CTYPE、LC_NUMERIC、LC_TIME、LC_COLLATE、LC_MONETARY、LC_MESSAGES、...
- 语言
因此目前接受的答案是不准确的。
环境变量格式
从另一部分Gnu Gettext 手册:
区域设置名称通常采用“ll_CC”格式。其中“ll”是 ISO 639 双字母语言代码,“CC”是 ISO 3166 双字母国家代码。
许多语言环境名称具有扩展语法“ll_CC.encoding”,它还指定字符编码。
一些语言环境名称使用“ll_CC@variant”而不是“ll_CC”。“@variant”可以表示语言 ll 和国家 CC 尚未暗示的任何类型的特征。