区域设置
Locales(区域设置)由 glibc 和其他支持 locale 的程序或库用于渲染文本、正确显示区域性的货币值、时间和日期格式、字母特性以及其他特定于 locale 的标准。
生成 locale
Locale 名称通常采用 language[_territory][.codeset][@modifier] 的形式,其中 *language* 是一个 ISO 639 语言代码,*territory* 是一个 ISO 3166 国家代码,*codeset* 是一个 字符集 或编码标识符,例如 ISO-8859-1 或 UTF-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
要显示当前设置的 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
有关详细信息,请参阅 #Variables 和 locale.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_CTYPELC_IDENTIFICATIONLC_MEASUREMENTLC_MESSAGESLC_MONETARYLC_NAMELC_NUMERICLC_PAPERLC_TELEPHONE- LC_TIME
上述 LC_* 变量的完整含义可以在 manpage locale(7) 中找到,而其定义的详细信息在 locale(5) 中描述。
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
en 或 en_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。
LC_COLLATE:排序规则
此变量控制用于排序和正则表达式的排序规则。
例如,将值设置为 C.UTF-8 可以使 ls 命令首先排序隐藏文件,然后是大小写字母文件名。
locale.conf
LC_COLLATE=C.UTF-8
另请参阅 [4]。
LC_ALL:故障排除
此变量设置的 locale 将始终覆盖 LANG 和所有其他 LC_* 变量,无论它们是否已设置。如果 LC_ALL 设置为 C 或 C.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]