Locale - Arch Linux 中文维基

跳至內容

# Locale

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Locale，最近一次同步於 2022-11-15，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- Environment variables
- Localization

glibc包 和應用程式、函數庫庫使用區域設置顯示本地化的文字、貨幣、時間、日期、特殊字符等包含地域屬性的內容。

## 生成區域設置

區域設置的名稱通常用 `[language][_TERRITORY][.CODESET][@modifier]` 的格式表示，language 是 ISO 639 語言代碼, territory 是 ISO 3166 國家代碼, codeset 是字符集或 ISO-8859-1、UTF-8 這樣的編碼方式。請參考 setlocale(3)。

要列出所有啟用的區域設置，使用：

    $ locale -a

啟用一個區域設置前，需要先生成它。在 `/etc/locale.gen` 中取消對應的注釋，然後執行 locale-gen。注釋掉某行，則會移除對應的區域設置。請啟用所有用戶都可能使用的區域設置及相關#變量。

例如對於使用美式英語和中國簡體的用戶：

    /etc/locale.gen

    ...
    #en_SG ISO-8859-1
    en_US.UTF-8 UTF-8
    #en_US ISO-8859-1
    ...
    #zh_CN.GBK GBK
    zh_CN.UTF-8 UTF-8
    #zh_CN GB2312
    ...

編輯完成以後,通過下面的命令生成 Locale：

    # locale-gen

注意：

- 每次更新 glibc包 時 `locale-gen` 會自動運行。[1]
- 建議優先使用 `UTF-8`。[2]

## 設置當前區域

想要顯示正在使用的 Locale 和相關的環境變量，運行：

    $ locale

要使用的區域設置（從前面生成的區域設置中選擇）設置在 `locale.conf` 文件中。每一個 `locale.conf` 文件都必須包含一些環境變量賦值語句，其格式與 locale 命令輸出的格式相同。

要查看已經生成的區域設置：

    $ localedef --list-archive

或者使用 localectl(1)：

    $ localectl list-locales

### 系統區域設置

要設置整個系統使用的區域設置，需要在 `/etc/locale.conf` 中寫入 `LANG` 變量，以下的 zh_CN.UTF-8 應為 `/etc/locale.gen` 中某個未注釋條目的第一列：

    locale.conf

    LANG=zh_CN.UTF-8

或者使用：

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

參閱#變量和 localectl(1) 獲得更多細節。

### 在用戶會話中覆蓋系統區域設置

系統使用的區域設置可以通過用戶編輯自己的 `~/$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` 的變更會在下次登錄時生效，要立刻應用新的設置的話，可以運行：

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

注意：`LANG` 變量必須先被 `unset`，否則 `locale.sh` 不會從 `locale.conf` 中更新變量。只有新增的或被修改的命令會被自動更新，從 `locale.conf` 被移除的變量在註銷前依然存在。

### 其它用例

和區域設置相關的變量也能像其他的環境變量一樣傳遞給其它程序。

例如在開發和測試某個程序時,可以這樣運行：

    $ LANG=C ./my_application.sh

類似的，也可以通過設置環境變量讓當前 shell 中運行的程序使用特定的區域設置(例如安裝系統時)：

    $ export LANG=C

## 變量

`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

locale(7) 包含了完整 `LC_*` 列表，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

注意：很多軟體並未將其英文 locale 設置為 `en` 或 `en_US`，而是使用默認 locale `C`。如果在 `LANGUAGE` 中將非英文 locale 設置到 English 之後，例如 `LANGUAGE=en_US:en:es_ES`，那麼即使英語字符存在，應用程式可能會選擇使用後備 locale. [3] 解決方法是強制在英語 locale 後面設置 `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

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` 可以讓 ls 命令首先列出點開頭的文件，然後是大寫字母開頭的文件和小寫字母開頭的文件：

    locale.conf

    LC_COLLATE=C

另見 [4]。

為了避免潛在的問題，Arch Linux 曾經在 `/etc/profile` 中設置 `LC_COLLATE=C`，這個方法已經過時了。

### LC_ALL：測試和排除問題

這個變量的值會覆蓋掉 `LANG` 和所有 `LC_*` 變量的值，無論它們是否設置。 如果 `LC_ALL` 設置為`C`, 此變量將覆蓋 `LANGUAGE`.

只有 `LC_ALL` 不能出現在 `locale.conf` 文件中：它只能為了測試和排除問題而設置，例如在 `/etc/profile` 中。

注意：`LC_ALL=C.UTF-8` 與 `LC_ALL=C` 不同，不會覆蓋 `LANGUAGE`. 請參考 glibc bug 16621 和 gettext bug 62815.

## 疑難解答

### 我的終端不支持 UTF-8

這裡列出了一些（不是全部）支持 UTF-8 的終端：

- gnustep-terminal
- konsole
- mlterm
- rxvt-unicode
- st
- 基於 VTE 的終端
- xterm - 啟動時使用參數 `-u8`，或者配置資源 `xterm*utf8: 2`。

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

你必須在 UTF-8 的區域設置下運行它們才會有作用。按照上面的方法啟用 `en_US.UTF-8`（或者其它使用 UTF-8 的區域設置）並將它設置成默認區域設置後重啟系統。

### 我的系統的語言還是不對

可能其它文件設置了本該由 `locale.conf`，詳見定義環境變量。

如果使用了桌面環境，可能是被桌面環境修改。例如 GNOME 的語言設置會覆蓋 `locale.conf` 中的設置。

KDE Plasma 也通過系統設置修改界面的語言，如果按本文修改後還是原來的區域設置，請刪除 `~/.config/plasma-localerc` (之前是：`~/.config/plasma-locale-settings.sh`)。

如果您正在結合 accountsservice包 使用顯示管理器，請遵循 Display manager#為用戶會話設置語言中的說明。

LightDM 將自動使用 accountsservice包 來設配置用戶的區域設置（如果已安裝）。否則，LightDM 將用戶會話配置存儲在 `~/.dmrc` 中。也可能從那裡檢索到意料外的的區域設置。

### 解壓文件的編碼不正確

老的 Windows 版本 (XP, Vista 和 7) 使用不同的編碼方式壓縮文件。要解壓這些文件，請使用：

    $ unzip -O CP936 file.zip

## 另見

- Gentoo:Localization/Guide
- Supposedly 2008, or earlier, Gentoo wiki article
- 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

分類：​

- 本地化

Locale
新增話題