一.基本概念
1.為什麼要實現資源的本地化?
我們的站點可能為全球各個國家和地區的人所浏覽,每個國家和地區的人都有自身的語言文化特點。就拿咱們偉大的祖國為例,中國大陸用簡體中文,港澳台則使用繁體中文。另外各個國家對於貨幣、數字、日歷等信息的表達格式各有不同,我們國家多使用年月日的格式,而美國則是月日年。諸如此類的區別林林總總,我也就不多舉例了。為了給我們的網站浏覽者更好的用戶體驗,我們應該提供一個全球化的解決方案,只要用戶選擇了他的語言和區域,站點就按照他的語言文化習慣來展現頁面信息,這個過程可以叫做本地化。
2.區域性、固定區域性、非特定區域性、特定區域性
區域性名稱遵循 RFC 1766 標准,格式為“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是從 ISO 639-1 派生的由兩個小寫字母構成的代碼,<country/regioncode2> 是從 ISO 3166 派生的由兩個大寫字母構成的代碼。例如,美國英語為“en-US”。在雙字母語言代碼不可用的情況中,將使用從 ISO 639-2 派生的三字母代碼;例如,三字母代碼“div”用於使用 Dhivehi 語言的區域。某些區域性名稱帶有指定書寫符號的後綴;例如“-Cyrl”指定西裡爾語書寫符號,“-Latn”指定拉丁語書寫符號。舉例:
區域性名稱 區域性標識符 語言-國家/地區 zh-CN 0x0804 中文-中國 zh-TW 0x0404 中文-台灣 zh-CHS 0x0004 簡體中文 zh-CHT 0x7C04 繁體中文 en 0x0009 英語 en-US 0x0409 英語-美國 en-GB 0x0809 英語-英國 uz-UZ-Cyrl 0x0843 烏茲別克語(西裡爾語)- 烏茲別克斯坦 uz-UZ-Latn 0x0443 烏茲別克語(拉丁)- 烏茲別克斯坦
固定區域性不區分區域性。可以使用空字符串 ("") 按名稱或者按區域性標識符 0x007F 來指定固定區域性。固定區域性由CultureInfo類的InvariantCulture屬性來代表固定區域性的實例。固定區域性僅與英語語言關聯,不與任何國家/地區關聯。它幾乎可用在要求區域性的“全局化”命名空間中的所有方法中。如果你的程序進行字符串比較或大小寫更改操作,則應該使用 InvariantCulture 確保無論系統如何設置的區域性,行為都將按照InvariantCulture所代表的英語語言的固定區域性來完成。但是,固定區域性必須僅由需要不依賴區域性的結果的進程(如系統服務)使用;否則,它得到的結果可能在語言上不正確,或者在文化上不合適。舉例:CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture;這兩行代碼的作用相同,目的是獲得固定區域性實例。
比如你現在要對一個DateTime的實例dateTime執行dateTime.ToString()方法。這個方法實際是使用你當前線程的CurrentCulture作為默認的區域性,根據這個區域性將日期實例轉化為相應的字符串形式。那麼如果我們此時不需要它按照線程或系統的區域性進行ToString操作,那麼我們應該用這個方法dateTime.ToString(“G”, CultureInfo.InvariantCulture)或者dateTime.ToString(“G”, DateTimeFormatInfo.InvariantInfo)。
非特定區域性是與某種語言關聯但不與國家/地區關聯的區域性。特定區域性是與某種語言和某個國家/地區關聯的區域性。例如,“en”是非特定區域性,而“en-US”是特定區域性。注意,“zh-CHS”(簡體中文)和“zh-CHT”(繁體中文)均為非特定區域性。
區域性有層次結構,即特定區域性的父級是非特定區域性,而非特定區域性的父級是 InvariantCulture。CultureInfo類的Parent屬性將返回與特定區域性關聯的非特定區域性。如果特定區域性的資源在系統中不存在,或因其它原因不可用,則使用非特定區域性的資源;如果非特定區域性的資源也不可用,那麼使用主程序集中嵌入的資源。
3.實現本地化常用的類型、屬性和方法
CultureInfo類表示有關特定區域性的信息,包括區域性的名稱、書寫體系和使用的日歷,以及有關對常用操作(如格式化日期和排序字符串)提供信息的區域性特定對象的訪問。CultureInfo類的實例化一般有兩個途徑,如下所示:
CultureInfo culture = CultureInfo.CreateSpecificCulture (name);
CultureInfo culture = new CultureInfo(name);