Locale
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
設置當前區域[編輯 | 編輯原始碼]
想要顯示正在使用的 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
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
。
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
中。
疑難解答[編輯 | 編輯原始碼]
我的終端不支持 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