Locale

出自 Arch Linux 中文维基

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

生成區域設置[編輯 | 編輯原始碼]

區域設置的名稱通常用 [language][_TERRITORY][.CODESET][@modifier] 的格式表示,languageISO 639 語言代碼, territoryISO 3166 國家代碼, codeset字符集ISO-8859-1UTF-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
注意:
  • 每次更新 glibclocale-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 設置為 enen_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_TIMEBug 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-8LC_ALL=C 不同,不會覆蓋 LANGUAGE. 請參考 glibc bug 16621gettext bug 62815.

疑難解答[編輯 | 編輯原始碼]

我的終端不支持 UTF-8[編輯 | 編輯原始碼]

這裏列出了一些(不是全部)支持 UTF-8 的終端:

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

另見[編輯 | 編輯原始碼]