跳转至内容

区域设置

来自 ArchWiki
(重定向自 Locale-gen)

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

生成 locale

Locale 名称通常采用 language[_territory][.codeset][@modifier] 的形式,其中 *language* 是一个 ISO 639 语言代码,*territory* 是一个 ISO 3166 国家代码,*codeset* 是一个 字符集 或编码标识符,例如 ISO-8859-1UTF-8。请参阅 setlocale(3)

要获取已启用 locales 的列表,请运行

$ locale --all-locales

在系统上启用 locale 之前,必须先生成它。这可以通过取消注释 /etc/locale.gen 中的相关条目并运行 locale-gen 来实现。反之,注释掉条目将禁用它们各自的 locale。在进行更改时,请考虑系统上其他用户可能需要的任何本地化设置,以及特定的 #变量

例如,对于德语,请取消注释 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

# locale-gen
  • locale-gen 也会在每次更新 glibc 时运行。[1]
  • 推荐使用 UTF-8 而非其他字符集。[2]

设置 locale

要显示当前设置的 locale 及其相关的环境变量,请键入

$ locale

要使用的 locale,从先前生成的 locale 中选择,设置在 locale.conf 文件中。这些文件中的每一个都必须包含一个换行符分隔的 环境变量 赋值列表,其格式与 locale 命令的输出相同。

要列出先前已生成的可用 locales,请运行

$ localedef --list-archive

或者,使用 localectl(1)

$ localectl list-locales

设置系统 locale

要设置系统 locale,请将 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

有关详细信息,请参阅 #Variableslocale.conf(5)

为用户会话覆盖系统 locale

可以通过创建或编辑 $XDG_CONFIG_HOME/locale.conf(通常是 ~/.config/locale.conf)来为每个用户会话覆盖系统范围的 locale。

这些 locale.conf 文件的优先级定义在 /etc/profile.d/locale.sh 中。

提示
  • 这也可以允许在 /var/log/ 中将日志保留为英文,同时在用户环境中使用本地语言。
  • 您可以创建一个 /etc/skel/.config/locale.conf 文件,以便使用 useradd-m 选项添加的任何新用户都将自动生成 ~/.config/locale.conf。请参阅 Users and groups#Changing user defaults

立即应用 locale 更改

一旦创建或编辑了系统和用户 locale.conf 文件,它们的新值将在新会话登录时生效。要使当前环境使用新设置,请取消设置 LANG 并执行 /etc/profile.d/locale.sh

$ unset LANG
$ source /etc/profile.d/locale.sh
注意 必须首先取消设置 LANG 变量,否则 locale.sh 将不会从 locale.conf 更新值。只有新的和已更改的变量才会被更新;从 locale.conf 中移除的变量仍会设置在会话中。

其他用法

Environment variables 中所述,也可以使用标准方法定义 locale 变量。

例如,为了在开发过程中测试或调试特定应用程序,可以像这样启动它:

$ LC_ALL=C.UTF-8 ./my_application.sh

同样,为了设置当前 shell 中运行的所有进程的 locale(例如,在系统安装期间)

$ 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_* 变量的完整含义可以在 manpage locale(7) 中找到,而其定义的详细信息在 locale(5) 中描述。

注意 程序在查找 locale 依赖值时会遵循 优先级顺序

LANG:默认 locale

此变量设置的 locale 将用于所有未显式设置的 LC_* 变量。

提示 假设您是西班牙的英语用户,并且希望您的程序按照西班牙的惯例处理数字和日期,而消息只显示英文。那么您可以将 LANG 变量设置为 es_ES.UTF-8,并将 LC_MESSAGES(消息翻译的用户界面)变量设置为 en_US.UTF-8

LANGUAGE:回退 locales

使用 gettext 进行翻译的程序除了常规变量外,还会遵循 LANGUAGE 选项。这允许用户指定一个按照此顺序使用的 列表。如果首选 locale 的翻译不可用,将使用相似 locale 的另一个翻译,而不是默认值。例如,澳大利亚用户可能希望回退到英式拼写而不是美式拼写。

locale.conf
LANG=en_AU.UTF-8
LANGUAGE=en_AU:en_GB:en
注意 许多应用程序不会将它们的英文 locale 命名或别名为 enen_US,而是将其作为默认 locale,即 C。如果在 LANGUAGE 中,非英文 locale 放在英文之后,例如 LANGUAGE=en_US:en:es_ES,那么应用程序可能会选择第二个 locale,尽管英文字符串是可用的。[3] 解决方案是始终将 C locale 显式放在英文之后。例如: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" 以您 locale 的日期和时间格式打印当前时间戳。

glibc 2.29 修复了一个 bug,en_US.UTF-8 开始显示 12 小时制,这本是预期的。如果想使用 24 小时制,请使用 LC_TIME=C.UTF-8

注意 程序不一定会遵循此变量来格式化日期。例如,date(1) 使用自己的参数来实现这一点,并且 Firefox 在版本 57 到 84 之间停止支持 LC_TIMEBug 1429578)。

LC_COLLATE:排序规则

此变量控制用于排序和正则表达式的排序规则。

例如,将值设置为 C.UTF-8 可以使 ls 命令首先排序隐藏文件,然后是大小写字母文件名。

locale.conf
LC_COLLATE=C.UTF-8

另请参阅 [4]

LC_ALL:故障排除

此变量设置的 locale 将始终覆盖 LANG 和所有其他 LC_* 变量,无论它们是否已设置。如果 LC_ALL 设置为 CC.UTF-8,它还将覆盖 LANGUAGE

LC_ALL 是 **不能** 在 locale.conf 文件中设置的唯一 LC_* 变量:它仅用于测试或故障排除目的,例如在 /etc/profile 中。

故障排除

对于编码问题,请检查 Character encoding#Troubleshooting

我的系统仍然使用错误的语言

环境变量可能在 locale.conf 之外的其他文件中被重新定义。有关详细信息,请参阅 Environment variables#Defining variables

如果您正在使用桌面环境,例如 GNOME,其语言设置可能会覆盖 locale.conf 中的设置。

KDE Plasma 也允许通过系统设置更改 UI 的语言。如果桌面环境在修改后仍使用默认语言,删除文件 ~/.config/plasma-localerc(以前是:~/.config/plasma-locale-settings.sh)应该可以解决问题。

如果您正在使用显示管理器并结合 accountsservice,请按照 Display manager#Set language for user session 中的说明操作。

LightDM 如果安装了 accountsservice,将自动使用它来设置用户的 locale。否则,LightDM 将用户会话配置存储在 ~/.dmrc 中。也有可能从那里检索到不想要的 locale 设置。

使用自定义 locale 导致问题

当安装一个不受官方支持的 locale 时(例如,locale-en_xxAUR),可能会出现一些问题,例如 在某些应用程序中死键/组合键不起作用应用程序报告 locale 丢失。安装自定义 locale 后,需要手动干预来解决这些问题。有两种 方法(将 en_XX.UTF-8 替换为您自定义 locale 的标识符)。

设置 LC_CTYPE

LC_CTYPE 设置为官方支持的 locale(例如 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

美制 locale 下的度量单位

在某些工具中,如 nvme-cli,单位类型是根据 locale 设置选择的;因此,如果使用美制 locale,温度将显示为华氏度。如果您希望在使用美制 locale 时使用公制单位,例如将温度显示为摄氏度,将 LC_MEASUREMENT=metric 添加到 /etc/locale.conf 应该有效,前提是该工具查找 LC_MEASUREMENT 而不是仅仅查找国家代码。[5]

参见