# Locale (简体中文)

翻译状态： 本文是英文页面 Locale 的翻译，最后翻译时间：2016-02-05，点击这里可以查看翻译后英文页面的改动。

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

Note:

- 每次更新 glibc 时 `locale-gen` 会自动运行.
- 建议开启 `UTF-8` Locales. [1]

## 设置 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

  参阅 `man 1 localectl` 获得更多细节.

Tip: 如果安装是使用的 `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.conf` 文件的优先级定义在 `/etc/profile.d/locale.sh` 中.

参阅 #支持的变量, `man 5 locale.conf` 和相关连的文章获得更多细节.

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

    $ LANG= source /etc/profile.d/locale.sh

Note: 这只有在 `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

The factual accuracy of this article or section is disputed.

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:

- 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 .

## 另见

- Gentoo Linux 本地化指南
- Gentoo Wiki Archives: Locales
- ICU's interactive collation testing
- Free Standards Group Open Internationalisation Initiative
- The Single UNIX Specification definition of Locale by The Open Group
- Locale environment variables

Category:

- Internationalization (简体中文)

Hidden categories:

- Pages using duplicate arguments in template calls
- Pages or sections flagged with Template:Accuracy