本地化
本地化 被 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_*
变量的完整含义可以在 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
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"。如果想要使用 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
。
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]