跳至內容

地區設定

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

區域設置(英語: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).