地區設定

地區設定(英語:locale),也稱作「本地化策略集」、「本地環境」,是表達程式使用者地區方面的軟件設定。不同系統、平台、與軟件有不同的地區設定處理方式和不同的設定範圍,但是一般地區設定最少也會包括語言和地區。作業系統的地區設定通常比較複雜。地區設定的內容包括:數據格式、貨幣金額格式、小數點符號、千分位符號、度量衡單位、通貨符號、日期寫法、日曆類型、文字排序、姓名格式、地址等等。

地區設定的主要目標是讓使用者選擇最適合他自己的設定。比如用以上的Windows作比喻:在控制面板的區域和語言選擇中,使用者可以選擇自己的字元集排序方法;當瀏覽檔案時,系統會使用「使用者選擇的排序」來排列檔案。

實際落實

電腦中一套定義使用者的語言、國家和用於定義使用者希望在其用戶介面上看到的各種可以改變的選擇的參數集合。通常一個地區設定識別碼至少包括一個語言識別碼和一個區域識別碼

UNIXWindows中,地區設定的控制是不同的。在UNIX下,通常通過環境變數來控制地區設定。這些環境變數包括:LC_ALL, LC_CTYPE, LC_TIME, 等等。你可以通過改變這些環境變數來控制你的程式或者命令所表現出來的地區設定,前提是這些程式或者命令必須是已經被國際化的和本地化的。在Windows下,你可以通過改變控制面板上的「語言/區域」中的區域的值來設定Windows的當前使用者的地區設定。

Ubuntu作業系統中,使用man locale-gen或man locale可獲得關於locale實現的細節。實際上是由glibc庫實現的。

locale相關(環境)變數生效的優先順序:[1]

  1. LANGUAGE 指定個人對語言環境值的主次偏好,例如zh_CN:en_US:en
  2. LC_ALL 這不是一個環境變數,是一個可被C語言庫函數setlocale設定的宏,其值可覆蓋所有其他的locale設定。因此預設時此值為空
  3. LC_xxx 可設定locale各方面(category)的值,可以覆蓋LANG的值。
  4. LANG 指定預設使用的locale值

可以把上述環境變數設在/etc/profile 或 /etc/environment等系統初始檔案中。值得注意的是,若LANG或LC_ALL被設定為 "C",那麼LANGUAGE的值將被忽視。 [2]

除 C 和 POSIX這兩個locale名稱外,locale的名稱並未標準化。Linux平台與Windows系統的locale名稱有很大不同。Linux名稱的命名規則為:

 language[_territory[.codeset]][@modifier]

其中language是ISO 639-1標準中定義的雙字母的語言代碼,territory是ISO 3166-1標準中定義的雙字母的國家和地區代碼,codeset是字元集的名稱 (如 UTF-8等),而 modifier 則是某些 locale 變體的修正符。

bash中的使用範例:

$ LC_TIME=en_US.UTF-8 date
Fri Oct 31 19:51:16 CST 2014
$ LC_TIME=fi_FI.UTF-8 date
pe 31.10.2014 19.52.00 +0800
$ LC_TIME=zh_CN.UTF-8 date
2014年 10月 31日 星期五 19:53:07 CST

相關系統檔案:

  • 在檔案/usr/share/i18n/SUPPORTED中,列出了當前系統支援的所有locale與字元集的名字。
  • 在目錄/var/lib/locales/supported.d/下,列出了當前系統已經生成的所有locale的名字。
  • 在檔案/var/lib/locales/supported.d/local中,列出了所有想要生成或已經生成的locale的名字
  • 在目錄/usr/lib/locale/<locale_name>/LC_*,用locale-gen編譯出的locale檔案
  • 在檔案/usr/lib/locale/locale-archive中,包含了很多本地已經生成的locale的具體內容,因此這個檔案往往很大。使用命令localedef管理這一檔案。使用locale-gen命令編譯出來的locale內容預設寫入該檔案中。
  • 在檔案/etc/default/locale中,可以手動組態locale環境變數,LC_CTYPE之類
  • 在目錄/usr/share/i18n/charmaps下,預設的charmap存放路徑
  • 在目錄/usr/share/i18n/locales下,預設的locale source file存放路徑

相關系統命令:

  • locale 列出當前採用的各項本地策略,這些由LC_*環境變數定義
  • locale charmap 列出系統當前使用的字元集
  • locale -a 列出系統中已經安裝的所有locale
  • locale -m 列出系統中已經安裝的所有charmap
  • locale-gen --purge 將/usr/lib/locale/裏面的locale支援檔案刪掉
  • 編輯檔案/var/lib/locales/supported.d/local,增加需要的locale與字元集名字,如:
en_US.UTF-8 UTF-8
cs_CZ.UTF-8 UTF-8
cs_CZ.iso88592 iso88592
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB2312 GB2312
zh_CN.GB18030 GB18030

儲存並關閉此檔案。執行sudo dpkg-reconfigure --force locales,則重新生成字元集。

  • 或者使用命令sudo locale-gen en_US.UTF-8,生成制定的locale en_US.UTF-8,並把這個locale名字加入檔案/var/lib/locales/supported.d/local中
  • 或者使用命令sudo locale-gen,生成所有列在檔案/var/lib/locales/supported.d/local中的locale
  • 或者
cd /usr/share/locales
sudo ./install-language-pack zh_CN

也可以安裝zh_CN的相關語言套件。

  • 或者使用命令localedef -f UTF-8 -i zh_CN zh_CN.UTF8,從字元對映檔案UTF-8,locale原始檔zh_CN,編譯出locale稱為zh_CN.UTF8,存放入檔案/usr/lib/locale/locale-archive中
  • 使用命令localedef --list-archive,列出檔案/usr/lib/locale/locale-archive中所有可用的locale的名字
  • sudo apt-get install language-selector language-env language-pack-zh-hans language-pack-zh-hant 安裝中文語言套件
  • sudo nano /etc/default/locale 修改該檔案內容。

Windows SDK規定,「語言」是與溝通有關的一組屬性的集合,包括所有允許的字元、通貨符號、日期時間格式等等。每個「語言」有一個語言名字與語言識別碼。語言往往還需要指出國家/地區,如「英語(美國)」使用的語言名字是「en-US」。

每個地區設定(locale)是一個「語言」及一個排序規則。Windows XP支援超過150個地區設定(locale);Windows Vista支援超過200個地區設定(locale);Windows 7支援至少365個地區設定(locale)。每個地區設定(locale)有地區設定名字(Locale Name )地區設定識別碼(Locale ID ,LCID )。例如:"de-DE_phoneb"是德國德語使用德式電話薄排序規則(該排序規則與拉丁字母序稍有不同)。 「區域識別碼」(Locale ID ,LCID )為32位元的值,在程式設計中經常用到。LCID構成為:

+-------------+---------+-------------------------+-------------------------+
|   Reserved  | Sort ID |     SubLanguage ID      |   Primary Language ID   |
+-------------+---------+-------------------------+-------------------------+
31         20 19     16 15                    10  9                         0   bit

LCID的低10位是主語言(primary language)的ID;高6位指定次語言(sublanguage)。LCID的低16位元稱為語言識別碼(language identifier),資料類型名為LANGID。例如,中文作為主語言,編號是0x04。作為次語言的台灣中文的編號是0x01;簡體中文的編號是0x02,香港中文是0x03,新加坡中文是0x04,澳門中文是0x05。因此,「中國大陸簡體中文」的區域識別碼等於次語言的標識0x02左移10位,再加上主語言的標識0x04,即(0x02<<10)+0x04=2052,所以簡體中文的LCID是2052。類似的,可以算出繁體中文的LCID是1028。美國英語的LCID是1033。使用Windows預定義宏,MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)的結果也是2052。所有的語言-國家地區列表見:MSDN:Language Identifier Constants and Strings頁面存檔備份,存於互聯網檔案館

排序識別碼(Sort Order Identifier)佔4位,用於表示排序的方法。如簡體中文有SORT_CHINESE_PRC(筆劃序)、SORT_CHINESE_PRCP(拼音序)。例如,使用筆劃序的簡體中文的locale名字為"zh-CN_stroke"。所有排序規則列表見:Sort Order Identifiers頁面存檔備份,存於互聯網檔案館)。

地區設定名字(Locale Name )的命名格式為:

locale ::
    primaryLanguage[-Script][-SubLanguage[_sortorder]]
   | "locale-name"
   | "language[_countryORregion[.CodePage]]"
   | ".CodePage"
   | "C"
   | ""
   | NULL

可理解為:

  • primaryLanguage是ISO 639-1ISO 639-2/T中定義的語言縮寫的小寫形式;
  • Script是ISO 15924定義的書寫系統的首字母大寫的4字母表示。例如,拉丁字母拼寫的烏茲別克語為「uz-Latn-UZ」。
  • SubLanguage是ISO 3166-1中定義的國家/地區二位字母代碼的大寫形式;例如:zh-CN_stroke的值為MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC),即133124。
  • locale-name形式是簡短的標準化字串,見表的Language tag欄目頁面存檔備份,存於互聯網檔案館)。a short, IETF-standardized string; for example, en-US for English (United States) or bs-Cyrl-BA for Bosnian (Cyrillic, Bosnia and Herzegovina). These forms are preferred. For a list of supported locale names by Windows operating system version, see the Language tag column of the table in Appendix A: Product Behavior in [MS-LCID]: Windows Language Code Identifier (LCID) Reference. This resource lists the supported language, script, and region parts of the locale names. For information about the supported locale names that have non-default sort orders, see the Locale name column in Sort Order Identifiers. Under Windows 10 or later, locale names that correspond to valid BCP-47 language tags are allowed. For example, jp-US is a valid BCP-47 tag, but it is effectively only US for locale functionality.
  • 同一個地區設定(locale),可以有多種字元集編碼表示。例如,Windows作業系統的簡體中文的預設編碼字元集(即頁碼)是GBK,即「936 (ANSI/OEM - Simplified Chinese GBK)」。而Linux作業系統統一使用UTF8字元集,所以Linux簡體中文的預設編碼字元集是UTF8。所有頁碼列表見:Code Page Identifiers頁面存檔備份,存於互聯網檔案館)。如果需要指出使用的頁碼,在上述字串最後用「.」區隔,後跟Windows頁碼數字或者「ACP」、「OCP」。例如:"French_Canada.1252"。指定頁碼只適用於 LC_ALL或LC_CTYPE。
  • 可以對當前預設的locale只指明頁碼,形如".code_page"。使用使用者預設語言與國家地區設定,即來自GetUserDefaultLocaleName()的結果。不建議採用此種方式,因為可能會產生不一致結果。

對於C標準庫函數setlocale(),指定參數locale的基本格式為:

Locale Name | language[_country_region[.code_page]] 

上述language與country_region一般不用縮寫,詳細列表見National Language Support (NLS) API Reference頁面存檔備份,存於互聯網檔案館)。例如,對與中文簡體,使用字串"chinese"、"chinese-simplified"、"chinese_CHN"、"chs",都能得到"Chinese (Simplified)_People's Republic of China.936"效果。

作業系統有一個當前地區設定。使用者可以在控制面板的地區設定中改變它。每個地區設定有許多相關的資訊,編程時可以用Locale information types取得這些值的資訊。作業系統賦予每個線程一個地區設定,初始值為LOCALE_SYSTEM_DEFAULT

相關系統API函數:

  • GetUserDefaultLCID 取得當前使用者的預設LCID。對於簡體中文作業系統返回值為2052
  • GetUserDefaultLocaleName 取得當前使用者的預設locale的名字。對於簡體中文作業系統該名字為zh-CN
  • GetSystemDefaultLCID 取得系統的預設LCID。對於簡體中文作業系統返回值為2052
  • GetSystemDefaultLocaleName 取得系統預設locale的名字
  • GetThreadLocale() 取得當前線程的LCID
  • SetThreadLocale 設定當前線程的LCID。
  • IsValidLocaleName 判斷一個字串是否為當前作業系統支援的locale的名字
  • LocaleNameToLCID 從locale的名字取得它的LCID
  • GetLocaleInfoEx 取得指定locale的各方面的資訊
  • EnumSystemLocalesEx 列舉當前作業系統支援的所有的locale的名字
  • EnumCalendarInfoExEx 列舉指定locale的日曆數據。例如zh-TW有兩個日曆型,分別為「格里曆(本地)」與「格里曆(英文)」。
  • EnumDateInfoExEx 列舉指定locale的各種calendar的日期格式。
  • GetCalendarInfoEx 查詢指定locale指定日曆型的指定方面的數據。
  • GetDateFormatEx 把時間數據轉換為指定格式的日期字串。
  • GetTimeFormatEx 把時間數據轉換為指定格式的時間字串。
  • GetDurationFormatEx 把一段持續時間的數據轉換為指定格式的字串。
  • EnumSystemLanguageGroups 同一語言組可能共用鍵盤配置、輸入法、TT字型、頁碼翻譯表等等。
  • GetSystemDefaultLangID 系統預設的非Unicode語言
  • GetKeyboardLayout 當前行程的輸入法
  • GetSystemDefaultUILanguage 選單、對話方塊、Windows訊息、INF檔案、幫助檔案等的預設語言
  • GetSystemPreferredUILanguages 作業系統使用的選單、對話方塊、Windows訊息、INF檔案、幫助檔案等的語言
  • GetUserDefaultUILanguage 使用者使用的選單、對話方塊、Windows訊息、幫助檔案等的語言
  • GetUserPreferredUILanguages 使用者使用的選單、對話方塊、Windows訊息、幫助檔案等的語言集合
  • GetThreadPreferredUILanguages 當前線程使用的UI語言集合

列表

區域描述 簡寫 十六進制值 十進制值
南非荷蘭語 af 0x0436 1078
南非荷蘭語(南非) af-ZA
阿姆哈拉語 am
阿姆哈拉語(埃塞俄比亞) am-ET
阿爾巴尼亞語 sq 0x041C 1052
阿拉伯語 ar
阿拉伯語-阿拉伯聯合酋長國 ar-AE 0x3801 14337
阿拉伯語-巴林 ar-BH 0x3C01 15361
阿拉伯語-阿爾及利亞 ar-DZ 0x1401 5121
阿拉伯語-埃及 ar-EG 0x0C01 3073
阿拉伯語-伊拉克 ar-IQ 0x0801 2049
阿拉伯語-約旦 ar-JO 0x2C01 11265
阿拉伯語-科威特 ar-KW 0x3401 13313
阿拉伯語-黎巴嫩 ar-LB 0x3001 12289
阿拉伯語-利比亞 ar-LY 0x1001 4097
阿拉伯語-摩洛哥 ar-MA 0x1801 6145
馬普切語 arn
馬普切語(智利) arn-CL
阿拉伯語-阿曼 ar-OM 0x2001 8193
阿拉伯語-卡塔爾 ar-QA 0x4001 16385
阿拉伯語-沙特阿拉伯 ar-SA 0x0401 1025
阿拉伯語-敘利亞 ar-SY 0x2801 10241
阿拉伯語-突尼斯 ar-TN 0x1C01 7169
阿拉伯語-也門 ar-YE 0x2401 9217
阿薩姆語 as
阿薩姆語-印度 as-IN
亞美尼亞語 hy 0x042B 1067
阿塞拜疆語 az
阿塞拜疆語-拉丁文 az-Latn 0x042C 1068
阿塞拜疆語-西里爾文 az-Cyrl 0x082C 2092
阿塞拜疆語-拉丁文-阿塞拜疆 az-Latn-AZ 0x042C 1068
阿塞拜疆語-西里爾文-阿塞拜疆 az-Cyrl-AZ 0x082C 2092
巴什基爾語 ba
巴什基爾語-俄羅斯 ba-RU
巴斯克語 eu 0x042D 1069
白俄羅斯語 be 0x0423 1059
白俄羅斯語-白俄羅斯 be-BY
保加利亞語 bg 0x0402 1026
保加利亞語-保加利亞 bg-BG
孟加拉語 bn
孟加拉語-孟加拉 bg-BD
孟加拉語-印度 bg-IN
藏語 bo
藏語-中國 bo-CN
布列塔尼語 bo
布列塔尼語-法國 br-FR
波斯尼亞語 bs
波斯尼亞語(西里爾文) bs-Cyrl
波斯尼亞語(西里爾文,波斯尼亞和黑塞哥維那) bs-Cyrl-BA
波斯尼亞語(拉丁文) bs-Latn
波斯尼亞語(拉丁文,波斯尼亞和黑塞哥維那) bs-Latn-BA
加泰隆語 ca 0x0403 1027
加泰羅尼亞語(西班牙) ca-ES 0x0403 1027
中文 zh
中文-中國大陸-拼音排序 zh-CN 0x0804 2052
中文-中國大陸-筆畫排序 zh-CN_stroke 0x20804
中文(簡體) zh-Hans 0x0004
中文(繁體) zh-Hant 0x7C04
中文-香港特別行政區 zh-HK 0x0C04 3076
中文-香港特別行政區部首筆畫序 zh-HK_radstr 0x0C04 3076
中文-澳門特別行政區 zh-MO 0x1404 5124
中文-澳門特別行政區部首筆畫序 zh-MO_radstr 0x1404 5124
中文-澳門特別行政區筆畫序 zh-MO_stroke 0x1404 5124
中文-新加坡 zh-SG 0x1004 4100
中文-新加坡筆畫序 zh-SG_stroke 0x1004 4100
中文-台灣 zh-TW 0x0404 1028
中文-台灣-Bopomofo排序 zh-TW 0x30404
中文-台灣拼音序 zh-TW_pronun 0x0404 1028
中文-台灣部首筆畫序 zh-TW_radstr 0x0404 1028
克羅地亞語 hr 0x041A 1050
科西嘉語 co
科西嘉語(法國) co-FR
捷克語 cs 0x0405 1029
捷克語(捷克共和國) cs-CZ
威爾斯語 cy
威爾斯語(英國) cy-GB
丹麥語 da 0x0406 1030
丹麥語(丹麥) da-DK 1030
荷蘭語-荷蘭 nl-nl 0x0413 1043
荷蘭語-比利時 nl-be 0x0813 2067
英語-加勒比 en-029
英語-澳大利亞 en-AU 0x0C09 3081
英語-伯利茲 en-BZ 0x2809 10249
英語-加拿大 en-CA 0x1009 4105
英語-加勒比 en-CB 0x2409 9225
英語-印度 en-IN 0x4009 16393
英語-愛爾蘭 en-IE 0x1809 6153
英語-牙買加 en-JM 0x2009 8201
英語-馬來西亞 en-MY 0x4409 17417
英語-新西蘭 en-NZ 0x1409 5129
英語-菲律賓 en-PH 0x3409 13321
英語-新加坡 en-SG 0x4809 18441
英語-南非 en-ZA 0x1C09 7177
英語-特立尼達島 en-TT 0x2C09 11273
英語-英國 en-GB 0x0809 2057
英語-美國 en-US 0x0409 1033
英語-津巴布韋 en-ZW 0x3009 12297
愛沙尼亞語 et 0x0425 1061
波斯語 fa 0x0429 1065
芬蘭語 fi 0x040B 1035
法羅語 fo 0x0438 1080
法語-法國 fr-fr 0x040C 1036
法語-比利時 fr-be 0x080C 2060
法語-加拿大 fr-ca 0x0C0C 3084
法語-盧森堡 fr-lu 0x140C 5132
法語-瑞士 fr-ch 0x100C 4108
蓋爾語-愛爾蘭 gd-ie 0x083C 2108
蓋爾語-蘇格蘭 gd 0x043C 1084
德語-德國-Dictionary排序 de-DE 0x0407 1031
德語-德國-Phone book排序 de-DE_phoneb 0x10407
德語-奧地利 de-AT 0x0C07 3079
德語-列支敦士登 de-LI 0x1407 5127
德語-盧森堡 de-LU 0x1007 4103
德語-瑞士 de-CH 0x0807 2055
下索布語 dsb
下索布語(德語) dsb_DE
迪維西語 dv
迪維西語(馬爾代夫) dv_MF
希臘語 el 0x0408 1032
希臘語(希臘) el-GR 0x0408 1032
希伯來語 he 0x040D 1037
印地語 hi 0x0439 1081
匈牙利語 hu 0x040E 1038
冰島語 is 0x040F 1039
印度尼西亞語 id 0x0421 1057
意大利語-意大利 it-it 0x0410 1040
意大利語-瑞士 it-ch 0x0810 2064
日語 ja 0x0411 1041
韓語 ko 0x0412 1042
拉脫維亞語 lv 0x0426 1062
立陶宛語 lt 0x0427 1063
馬其頓 mk 0x042F 1071
馬來語-馬來西亞 ms-my 0x043E 1086
馬來語-汶萊 ms-bn 0x083E 2110
馬耳他語 mt 0x043A 1082
馬拉地語 mr 0x044E 1102
挪威-伯克梅爾 nb-no 0x0414 1044
挪威-尼諾斯克語 nn-no 0x0814 2068
波蘭語 pl 0x0415 1045
葡萄牙語-葡萄牙 pt-pt 0x0816 2070
葡萄牙語-巴西 pt-br 0x0416 1046
羅曼什語 rm 0x0417 1047
羅馬尼亞語-羅馬尼亞 ro 0x0418 1048
羅馬尼亞語-摩爾多瓦共和國 ro-mo 0x0818 2072
俄語 ru 0x0419 1049
俄羅斯-摩爾多瓦共和國 ru-mo 0x0819 2073
梵文 sa 0x044F 1103
塞爾維亞語-西里爾字母 sr-sp 0x0C1A 3098
塞爾維亞語-拉丁文 sr-sp 0x081A 2074
茨瓦納語 tn 0x0432 1074
斯洛文尼亞語 sl 0x0424 1060
斯洛伐克語 sk 0x041B 1051
索布語 sb 0x042E 1070
西班牙語-西班牙 (現代) es-es 0x0C0A 3082
西班牙語-西班牙 (傳統) 0x040A 1034
西班牙語-阿根廷 es-ar 0x2C0A 11274
西班牙語-玻利維亞 es-bo 0x400A 16394
西班牙語-智利 es-cl 0x340A 13322
西班牙語-哥倫比亞 es-co 0x240A 9226
西班牙語-哥斯達黎加 es-cr 0x140A 5130
西班牙語-多米尼加共和國 es-do 0x1C0A 7178
西班牙語-厄瓜多爾 es-ec 0x300A 12298
西班牙語-危地馬拉 es-gt 0x100A 4106
西班牙語-洪都拉斯 es-hn 0x480A 18442
西班牙語-墨西哥 es-mx 0x080A 2058
西班牙語-尼加拉瓜 es-ni 0x4C0A 19466
西班牙語-巴拿馬 es-pa 0x180A 6154
西班牙-秘魯 es-pe 0x280A 10250
西班牙語-波多黎各 es-pr 0x500A 20490
西班牙語-巴拉圭 es-py 0x3C0A 15370
西班牙語-薩爾瓦多 es-sv 0x440A 17418
西班牙語-烏拉圭 es-uy 0x380A 14346
西班牙語-委內瑞拉 es-ve 0x200A 8202
南部索托語 st 0x0430 1072
斯瓦希里語 sw 0x0441 1089
瑞典語-瑞典 sv-se 0x041D 1053
瑞典語-芬蘭 sv-fi 0x081D 2077
泰米爾語 ta 0x0449 1097
韃靼語 tt 0X0444 1092
泰語 th 0x041E 1054
土耳其語 tr 0x041F 1055
特松加 ts 0x0431 1073
烏克蘭語 uk 0x0422 1058
烏都語 ur 0x0420 1056
烏茲別克語-西里爾文 uz-uz 0x0843 2115
烏茲別克語-拉丁文 uz-uz 0x0443 1091
越南語 vi 0x042A 1066
班圖語 xh 0x0434 1076
意第緒語 yi 0x043D 1085
祖魯語 zu 0x0435 1077

參見

外部連結

參考文獻

  1. ^ In IBM developerworks网站 王华东:“浅析 Linux 的国际化与本地化机制”. [2014-10-31]. (原始內容存檔於2014-10-31). 
  2. ^ A Quick Primer On Unicode and Software Internationalization Under Linux and UNIX by Ed Trager. [2014-11-30]. (原始內容存檔於2014-12-04).