区域设置

出自 ArchWiki

区域设置glibc 和其他支持区域设置的程序或库使用,用于渲染文本,正确显示地区货币值、时间和日期格式、字母顺序特性以及其他特定于区域设置的标准。

生成区域设置

区域设置名称通常采用 language[_territory][.codeset][@modifier] 的形式,其中 languageISO 639 语言代码territoryISO 3166 国家代码codeset字符集 或编码标识符,例如 ISO-8859-1UTF-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-gen 也会在每次更新 glibc 时运行。[1]
  • 建议使用 UTF-8 而不是其他字符集。[2]

设置区域设置

要显示当前设置的区域设置及其相关的环境设置,请输入

$ 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
注意: 许多应用程序不会将其英语区域设置命名或别名为 enen_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

注意: 程序不一定遵循此变量来格式化日期。例如,date(1) 使用自己的参数来执行此操作,并且 Firefox 从版本 57 到 84 不再遵循 LC_TIME (Bug 1429578)。

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 设置为 CC.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]

参见