区域设置
区域设置 被 glibc 和其他支持区域设置的程序或库使用,用于渲染文本,正确显示地区货币值、时间和日期格式、字母顺序特性以及其他特定于区域设置的标准。
生成区域设置
区域设置名称通常采用 language[_territory][.codeset][@modifier]
的形式,其中 language 是 ISO 639 语言代码,territory 是 ISO 3166 国家代码,codeset 是 字符集 或编码标识符,例如 ISO-8859-1 或 UTF-8。请参阅 setlocale(3)。
要获取已启用区域设置的列表,请运行
$ locale --all-locales
在系统上启用区域设置之前,必须先生成它。这可以通过取消注释 /etc/locale.gen
中适用的条目,并运行 locale-gen 来实现。同样,注释条目会禁用其各自的区域设置。在进行更改时,请考虑系统上其他用户所需的任何本地化,以及特定的#变量。
例如,对于德语,取消注释 de_DE.UTF-8 UTF-8
(除了通常用作各种工具后备的 en_US.UTF-8 UTF-8
之外)
/etc/locale.gen
... #de_CH ISO-8859-1 de_DE.UTF-8 UTF-8 #de_DE ISO-8859-1 ... #en_SG ISO-8859-1 en_US.UTF-8 UTF-8 #en_US ISO-8859-1 ...
保存文件,并生成区域设置
# locale-gen
设置区域设置
要显示当前设置的区域设置及其相关的环境设置,请输入
$ locale
要使用的区域设置(从先前生成的区域设置中选择)在 locale.conf
文件中设置。这些文件中的每一个都必须包含一个以换行符分隔的 环境变量 赋值列表,其格式与 locale 的输出格式相同。
要列出先前已生成的可用区域设置,请运行
$ localedef --list-archive
或者,使用 localectl(1)
$ localectl list-locales
设置系统区域设置
要设置系统区域设置,请将 LANG
变量写入 /etc/locale.conf
,其中 en_US.UTF-8
属于 /etc/locale.gen
中未注释条目的第一列
/etc/locale.conf
LANG=en_US.UTF-8
或者,运行
# localectl set-locale LANG=en_US.UTF-8
有关详细信息,请参阅 #变量 和 locale.conf(5)。
为每个用户会话覆盖系统区域设置
可以通过创建或编辑 $XDG_CONFIG_HOME/locale.conf
(通常为 ~/.config/locale.conf
)来覆盖每个用户会话中的系统范围区域设置。
这些 locale.conf
文件的优先级在 /etc/profile.d/locale.sh
中定义。
- 这也允许将
/var/log/
中的日志保留为英语,同时在用户环境中使用本地语言。 - 您可以创建一个
/etc/skel/.config/locale.conf
文件,以便任何使用 useradd 和-m
选项添加的新用户都将自动生成~/.config/locale.conf
。请参阅 用户和群组#更改用户默认设置。
立即生效区域设置更改
一旦创建或编辑了系统和用户 locale.conf
文件,它们的新值将在登录时对新会话生效。要使当前环境使用新设置,请取消设置 LANG
并 source /etc/profile.d/locale.sh
$ unset LANG $ source /etc/profile.d/locale.sh
LANG
变量,否则 locale.sh
将不会从 locale.conf
更新值。只会更新新的和更改的变量;从 locale.conf
中删除的变量仍将在会话中设置。其他用途
也可以使用 环境变量 中解释的标准方法定义区域设置变量。
例如,为了在开发期间测试或调试特定的应用程序,可以使用如下命令启动它
$ LC_ALL=C.UTF-8 ./my_application.sh
同样,要为从当前 shell 运行的所有进程设置区域设置(例如,在系统安装期间)
$ export LC_ALL=C.UTF-8
变量
locale.conf
文件支持以下环境变量。
- LANG
- LANGUAGE
LC_ADDRESS
- LC_COLLATE
LC_CTYPE
LC_IDENTIFICATION
LC_MEASUREMENT
LC_MESSAGES
LC_MONETARY
LC_NAME
LC_NUMERIC
LC_PAPER
LC_TELEPHONE
- LC_TIME
以上 LC_*
变量的完整含义可以在手册页 locale(7) 中找到,而它们的定义细节在 locale(5) 中描述。
LANG:默认区域设置
为此变量设置的区域设置将用于所有未显式设置的 LC_*
变量。
LANG
变量设置为 es_ES.UTF-8
,并将 LC_MESSAGES
(消息翻译的用户界面)变量设置为 en_US.UTF-8
。LANGUAGE:备用区域设置
使用 gettext 进行翻译的程序除了常用变量外,还尊重 LANGUAGE
选项。这允许用户指定一个按顺序使用的区域设置列表。如果首选区域设置的翻译不可用,则将使用来自类似区域设置的另一个翻译,而不是默认翻译。例如,澳大利亚用户可能希望回退到英式拼写而不是美式拼写
locale.conf
LANG=en_AU.UTF-8 LANGUAGE=en_AU:en_GB:en
en
或 en_US
,而是将其作为默认区域设置,即 C
。如果在 LANGUAGE
中,非英语区域设置位于英语之后,例如 LANGUAGE=en_US:en:es_ES
,那么即使英语字符串可用,应用程序也可能会选择辅助区域设置。[3] 解决方案始终是将 C
区域设置显式地放在英语之后。例如 LANGUAGE=en_US:en:C:es_ES
。LC_TIME:日期和时间格式
如果 LC_TIME
设置为 en_US.UTF-8
,例如,日期格式将为“MM/DD/YYYY”。如果想要使用 “YYYY-MM-DD” 的 ISO 8601 日期格式,请使用
locale.conf
LC_TIME=en_DK.UTF-8
您可以使用 date +"%c"
以您的区域设置日期和时间格式打印当前时间戳。
glibc 2.29 修复了一个错误,en_US.UTF-8
开始以 12 小时格式显示,这是预期的。如果想要使用 24 小时格式,请使用 LC_TIME=C.UTF-8
。
LC_COLLATE:排序规则
此变量控制用于排序和正则表达式的排序规则。
例如,将值设置为 C.UTF-8
可以使 ls 命令首先对点文件进行排序,然后对大写和小写文件名进行排序
locale.conf
LC_COLLATE=C.UTF-8
另请参见 [4]。
为了解决潜在的问题,Arch 过去常常在 /etc/profile
中设置 LC_COLLATE=C
,但此方法现在已弃用。
LC_ALL:故障排除
为此变量设置的区域设置将始终覆盖 LANG
和所有其他 LC_*
变量,无论它们是否已设置。如果 LC_ALL
设置为 C
或 C.UTF-8
,它也会覆盖 LANGUAGE
。
LC_ALL
是唯一不能在 locale.conf
文件中设置的 LC_*
变量:它仅用于测试或故障排除目的,例如在 /etc/profile
中。
故障排除
对于编码问题,请检查 字符编码#故障排除。
我的系统仍然使用错误的语言
环境变量可能在 locale.conf
以外的其他文件中重新定义。有关详细信息,请参阅 环境变量#定义变量。
如果您使用的是桌面环境,例如 GNOME,则其语言设置可能会覆盖 locale.conf
中的设置。
KDE Plasma 也允许通过系统设置更改 UI 的语言。如果在修改后桌面环境仍在使用默认语言,则删除以下文件 ~/.config/plasma-localerc
(以前:~/.config/plasma-locale-settings.sh
)应该可以解决问题。
如果您将显示管理器与 accountsservice 结合使用,请按照 显示管理器#为用户会话设置语言 中的说明进行操作。
LightDM 将在安装 accountsservice 时自动使用它来设置用户的区域设置。否则,LightDM 会将用户会话配置存储在 ~/.dmrc
中。也可能从那里检索到不需要的区域设置。
使用自定义区域设置导致问题
当安装非官方支持的区域设置(例如,locale-en_xxAUR)时,可能会出现一些问题,例如 某些应用程序中死键/组合键无法工作 或 应用程序报告缺少区域设置。安装自定义区域设置后,需要手动干预才能解决这些问题。有 两种方法(将 en_XX.UTF-8
替换为您自定义区域设置的标识符)
设置 LC_CTYPE
将 LC_CTYPE
设置为官方支持的区域设置(如 en_US.UTF-8
),例如
/etc/locale.conf
LANG=en_XX.UTF-8 LC_CTYPE=en_US.UTF-8
修改 Xlib 数据库
通过添加以下内容来修改 Xlib 数据库
/usr/share/X11/locale/locale.dir
en_US.UTF-8/XLC_LOCALE en_XX.UTF-8 en_US.UTF-8/XLC_LOCALE: en_XX.UTF-8
/usr/share/X11/locale/compose.dir
en_US.UTF-8/Compose en_XX.UTF-8 en_US.UTF-8/Compose: en_XX.UTF-8
使用美国区域设置的公制单位
在某些工具(如 nvme-cli
)中,单位类型是根据 locale
设置选择的;因此,如果使用美国区域设置,温度将以华氏度显示。如果您希望在美国区域设置中使用公制单位,例如以摄氏度显示温度,则将 LC_MEASUREMENT=metric
添加到 /etc/locale.conf
应该可以工作,如果该工具搜索的是 LC_MEASUREMENT
而不仅仅是国家/地区。[5]