Locale (简体中文)
Locales 被 glibc 和其它需要本地化的应用程序和库用来解析文本(或正确的显示当前区域的某些文字样式,如货币,时间,日期,特殊字符和其他的区域格式).
生成 locale
设置 locale 前,需要先准备需要的 locale。要列出所有启用的locale,使用:
$ locale -a
可生成的 Locale 保存在 /etc/locale.gen
中,用以下的格式来定义:[language][_TERRITORY][.CODESET][@modifier]
.要开启某个Locale,反注释对应的行即可.
尽管在你的电脑上你很可能只使用一种语言,但同时开启其它的 Locale 有时会有帮助、甚至是必要的.比如你正运行着一个多用户的系统,而有的用户并不懂en_US,那么你的系统需要支持他们需要的 locale.
例如对于使用美式英语的用户,反注释 en_US.UTF-8 UTF-8
一行.
/etc/locale.gen
... #en_SG ISO-8859-1 en_US.UTF-8 UTF-8 #en_US ISO-8859-1 ...
编辑完成以后,通过下面的命令生成 Locale :
# locale-gen
设置 locale
想要显示正在使用的 Locale 和相关的环境变量,运行:
$ locale
locale.conf
文件存放如何使用和选择不同的 Locale 相关的环境变量.一行一个,例如:
locale.conf
LANG=en_AU.UTF-8 LC_COLLATE=C LC_TIME=en_DK.UTF-8
-
整个系统 使用的 Locale 可以通过创建或编辑
/etc/locale.conf
来设置,或者通过 localectl 设置:
# localectl set-locale LANG=en_US.UTF-8
- 参阅 localectl(1) 获得更多细节.
locale
正是你需要的,可以在 chroot 后通过 # locale > /etc/locale.conf
进行设置。-
整个系统 使用的 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 ,就能让日志(例如
这些 locale.conf
文件的优先级定义在 /etc/profile.d/locale.sh
中.
参阅 #支持的变量, locale.conf(5) 和相关连的文章获得更多细节.
locale.conf
的变更会在下次登录时生效,要立刻应用新的设置的话,可以运行:
$ LANG= source /etc/profile.d/locale.sh
LANG
变量没设置时才会有用.而且如果你在 locale.conf
中移除了某些变量再运行这个命令,移除的那些变量在注销前依然存在.其它用例
和 Locale 相关的变量也能像其他的 环境变量 一样传递给其它程序.
例如在开发时进行测试时,可以这样运行:
$ LANG="en_AU.UTF-8" ./my_application.sh
类似的,也可以通过设置环境变量让当前 shell中运行的程序使用特定的 Locale,(例如安装系统时):
$ export LANG="en_AU.UTF-8"
支持的变量
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
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
/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:
- gnustep-terminal
- konsole
- mlterm
- rxvt-unicode
- st
- termite
- VTE-based terminals
-
xterm - 必须包含参数
-u8
. 或者 uxterm, 随 xterm 提供.
Gnome-terminal / rxvt-unicode 不支持 UTF-8
你必须在 UTF-8 的 Locale 下运行它们在会有作用.按照上面的方法启用 en_US.UTF-8
Locale ,将它设置成默认 Locale 后重新启动.
我的系统的语言还是不对
可能其它文件设置了本该由 locale.conf
设置的 Locale (例如 ~/.pam_environment
),详见 Environment variables#Defining variables .