Locale (简体中文)

From ArchWiki
Jump to navigation Jump to search
翻译状态:本文是 Locale翻译。上次翻译日期:2020-05-08。如果英文版本有所更改,则您可以帮助同步翻译。

glibc 和应用程序、函数库库使用 Locales 显示本地化的文字、货币、时间、日期、特殊字符等包含地域属性的内容。

生成 locale

Locale 名称通常用 [language][_TERRITORY][.CODESET][@modifier] 的格式表示,languageISO 639 语言代码, territoryISO 3166 国家代码, codeset字符集ISO-8859-1UTF-8 这样的编码方式。请参考 setlocale(3).

要列出所有启用的locale,使用:

$ locale -a

启用一个 Locale 前,需要先生成它. 在 /etc/locale.gen 中取消对应的注释,然后执行 locale-gen. 注释掉某行,则会移除对应的 locale.请启用所有用户都可能使用的 locale 及其变体。

例如对于使用美式英语和中国简体的用户:

/etc/locale.gen
...
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
...

编辑完成以后,通过下面的命令生成 Locale :

# locale-gen
Note:
  • 每次更新 glibclocale-gen 会自动运行.
  • 建议优先使用 UTF-8. [1]

设置 locale

想要显示正在使用的 Locale 和相关的环境变量,运行:

$ locale

要查看已经生产的 locale:

$ localedef --list-archive

或者使用 localectl(1):

$ localectl list-locales

Setting the system locale

整个系统 使用的 Locale 可以通过创建或编辑 /etc/locale.conf 来设置,或者通过 localectl 设置。locale.conf 文件存放如何使用和选择不同的 Locale 相关的环境变量.一行一个,例如:

locale.conf
LANG=zh_CN.UTF-8
LC_COLLATE=C
LC_TIME=zh_CN.UTF-8

或者使用:

# localectl set-locale LANG=zh_CN.UTF-8

参阅 localectl(1) 获得更多细节.

单个用户的设置

整个系统 使用的 Locale 可以由用户通过编辑用户自己的 ~/.config/locale.conf (或者 {ic|$XDG_CONFIG_HOME/locale.conf}} 或 $HOME/.config/locale.conf) 来覆盖.

Tip:
  • 设置用户级 Locale ,就能让日志(例如 /var/log )中的文件以英语输出.
  • 建立 /etc/skel/.config/locale.conf 文件,可以让新用户建立且同时创建主目录时( useradd -m )自动应用其中的 Locale (会将这个文件复制到 ~/.config/locale.conf 中.)

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

参阅 locale.conf(5) 和相关连的文章获得更多细节.

立即启用新设置

locale.conf 的变更会在下次登录时生效,要立刻应用新的设置的话,可以运行:

$ unset LANG
$ source /etc/profile.d/locale.sh
Note: 这只有在 LANG 变量没设置时才会有用.而且如果你在 locale.conf 中移除了某些变量再运行这个命令,移除的那些变量在注销前依然存在.

其它用例

和 Locale 相关的变量也能像其他的 环境变量 一样传递给其它程序.

例如在开发时进行测试时,可以这样运行:

$ LANG=C ./my_application.sh

类似的,也可以通过设置环境变量让当前 shell中运行的程序使用特定的 Locale,(例如安装系统时):

$ export LANG=C

变量

locale.conf files support the following environment variables:

  • LANG
  • LANGUAGE
  • LC_CTYPE
  • LC_NUMERIC
  • LC_TIME
  • LC_COLLATE
  • LC_MONETARY
  • LC_MESSAGES
  • LC_PAPER
  • LC_NAME
  • LC_ADDRESS
  • LC_TELEPHONE
  • LC_MEASUREMENT
  • LC_IDENTIFICATION

locale(7) 包含了完整 LC_* 列表,locale(5) 包含了详细定义。

LANG: 默认的 Locale

这个变量的值会覆盖掉所有未设置的 LC_* 变量的值.

LANGUAGE: 后备 Locale

使用 gettext 翻译的软件会按照 LANGUAGE 选择使用的语言。用户通过这个变量指定一个locale 列表,如果前面的 locale 缺少翻译,会自动使用后面的 locale 显示界面。 例如下面的例子使用简体中文,没有翻译时使用英文:

locale.conf
LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN:en_GB:en"

LC_TIME: 时间和日期格式

如果 LC_TIME 设置成 en_US.UTF-8, 日期的格式为 "MM/DD/YYYY". 要使用 ISO 8601 标准的日期格式( "YYYY-MM-DD" ) ,使用:

locale.conf
LC_TIME=en_DK.UTF-8

LC_COLLATE: 排序格式

这个变量的值决定排序和正则表达式的格式顺序.

例如将它设置为 C 可以让 ls 命令按顺序列出 dotfile,大写字母开头的文件和小写字母开头的文件:

locale.conf
LC_COLLATE=C

另见 [2].

为了避免可能的问题,Arch Linux 曾经在 /etc/profile 中设置 LC_COLLATE=C ,这个方法已经过时了.w deprecated.

LC_ALL

这个变量的值会覆盖掉 LANG 和所有 LC_* 变量的值,无论它们是否设置.

只有 LC_ALL 不能在 locale.conf 文件中,这意味着它只是为了测试和排除问题而设置,例如在 /etc/profile 中.

自定义 Locale

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: 因为相关的文件不在 软件包 glibc 的 PKGBUILD 文件中的 backup 字段 中,所以你修改的 Locale 会在下次升级 glibc 时被覆盖.所以请创建自定义 Locale (而不是修改已有的 Locale ). (Discuss in Talk:Locale (简体中文)#)

/usr/share/i18n/locales/ 存放着所有的 Locale,并且可以被修改以适应不同的需要.

记得在修改 Locale 文件以后重新生成 Locale 并重新启动以让新的 Locales 生效.

设置每周的第一天

很多国家都把星期一作为每周的第一天,可以像这样进行修改:

/usr/share/i18n/locales/chosen_locale
LC_TIME
[...]
week            7;19971130;5
first_weekday   2
first_workday   2

提示和技巧

从终端中以另一 Locale 运行程序

例如用 Hebrew Locale 运行 Abiword :

$ env LANG=he_IL.UTF-8 abiword &

从桌面以另一 Locale 运行程序

.desktop 文件复制到你的用户目录:

$ cp /usr/share/applications/abiword.desktop ~/.local/share/applications/

编辑 Exec 选项:

~/.local/share/applications/abiword.desktop
Exec=env LANG=he_IL.UTF-8 abiword %U

Python, ViM 和 UTF-8

在 ViM 中运行 :!python -c "import sys; print(sys.stdout.encoding)" 时,输出可能是 ANSI_X3.4-1968 (即使你设置了正确的Locale) . 把 PYTHONIOENCODING 变量设置成 utf-8 可以规避这个问题.

排除问题

我的终端不支持 UTF-8

这些终端(不是全部)支持 UTF-8:

Gnome-terminal / rxvt-unicode 不支持 UTF-8

你必须在 UTF-8 的 Locale 下运行它们在会有作用.按照上面的方法启用 en_US.UTF-8 Locale ,将它设置成默认 Locale 后重新启动.

我的系统的语言还是不对

可能其它文件设置了本该由 locale.conf 设置的 Locale (例如 ~/.pam_environment ),详见 Environment variables#Defining variables.

如果使用了桌面环境,可能是被桌面环境修改。例如 GNOME 的语言设置会覆盖 locale.conf 中的设置。

KDE Plasma 也通过系统设置修改界面的语言,如果按本文修改后还是原来的 locale,请删除 ~/.config/plasma-localerc (之前是: ~/.config/plasma-locale-settings.sh).或在区域设置的格式菜单中设置需要的语言。

另见