C#:設定當前線程的地區性

來源:互聯網
上載者:User
   設定當前線程的地區性

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“都沒有預設關聯特定地區,所以上面的第四段代碼會報錯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.