設定當前線程的地區性
public static void SetCurrentThreadCultureInfo(string name)
{
Properties.Resource.Culture = new System.Globalization.CultureInfo(name);
var newName = name;
switch (Properties.Resource.Culture.Name)
{
case "zh-CHS":
newName = "zh-CN";
break;
case "zh-CHT":
newName = "zh-TW";
break;
default:
break;
}
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(newName);
}
註:
如下面的代碼:
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CHS");
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
上面這兩種寫法,在執行時都會報異常:
如果修改成如下寫法:
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en");
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("zh-CHS");
代碼一可以正常執行,代碼二執行出現如下錯誤:
上面的代碼為什麼會出現,這樣的問題呢?
這裡我們要來說一下:地區性、固定地區性、非特定地區性、特定地區性
地區性名稱遵循 RFC 1766 標準,格式為“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是從 ISO 639-1 派生的由兩個小寫字母構成的代碼,<country/regioncode2> 是從 ISO 3166 派生的由兩個大寫字母構成的代碼。例如,美國英語為“en-US”。在雙字母語言代碼停用情況中,將使用從 ISO 639-2 派生的三字母代碼;例如,三字母代碼“div”用於使用 Dhivehi 語言的地區。某些地區性名稱帶有指定書寫符號的尾碼;例如“-Cyrl”指定西裡爾語書寫符號,“-Latn”指定拉丁語書寫符號。
固定地區性不區分地區性。可以使用Null 字元串 ("") 按名稱或者按地區性標識符 0x007F 來指定固定地區性。固定地區性由CultureInfo類的InvariantCulture屬性來代表固定地區性的執行個體。固定地區性僅與英語語言關聯,不與任何省/地區關聯。它幾乎可用在要求地區性的“全域化”命名空間中的所有方法中。如果你的程式進行字串比較或大小寫更改操作,則應該使用 InvariantCulture 確保無論系統如何設定的地區性,行為都將按照InvariantCulture所代表的英語語言的固定地區性來完成。
非特定地區性是與某種語言關聯但不與省/地區關聯的地區性。特定地區性是與某種語言和某個省/地區關聯的地區性。例如,“en”是非特定地區性,而“en-US”是特定地區性。注意,“zh-CHS”(簡體中文)和“zh-CHT”(繁體中文)均為非特定地區性。
地區性有階層,即特定地區性的父級是非特定地區性,而非特定地區性的父級是 InvariantCulture。CultureInfo類的Parent屬性將返回與特定地區性關聯的非特定地區性。如果特定地區性的資源在系統中不存在,或因其它原因不可用,則使用非特定地區性的資源;如果非特定地區性的資源也不可用,那麼使用主程式集中內嵌資源。
下面這兩個語句有什麼異同:
var cultureSpecific = CultureInfo.CreateSpecificCulture(name);
var culture = new CultureInfo(name);
使用第一種方法,只能建立固定地區性或特定地區性的CultureInfo執行個體。如果name為空白字串,則建立固定地區性的執行個體,如果name為非特定地區性,那麼建立name 關聯的預設特定地區性的 CultureInfo執行個體。第二種方法,則是建立一個name所指定的地區性的CultureInfo執行個體,它可以是固定的,非特定的或特定地區性的。
雖然“en”和”zh-CHS”都是非固定地區,但是“en”預設有關聯的特定地區,而”zh-CHS“和”zh-CHT“都沒有預設關聯特定地區,所以上面的第四段代碼會報錯。