本地化

出自 ArchWiki
(重定向自 Localectl)

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

生成本地化

本地化名称通常采用 language[_territory][.codeset][@modifier] 的形式,其中 language 是一个 ISO 639 语言代码territory 是一个 ISO 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_* 变量的完整含义可以在 manpage 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"。如果想要使用 ISO 8601 的 "YYYY-MM-DD" 日期格式,请使用

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]

参见