多语言软件开发之new CultureInfo(“”)与CultureInfoCreateSpecificCulture(“”)的异同

       在多语言资源软件制作中肯定会遇到这样的问题,如下面的代码:

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CHS");
 

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
 

上面这两种写法,在执行时都会报异常:

image

如果修改成如下写法:

System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en");
 
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("zh-CHS");
 

代码一可以正常执行,代码二执行出现如下错误:

image

上面的代码为什么会出现,这样的问题呢?

这里我们要来说一下:区域性、固定区域性、非特定区域性、特定区域性

区域性名称遵循 RFC 1766 标准,格式为“<languagecode2>-<country/regioncode2>”,其中 <languagecode2> 是从 ISO 639-1 派生的由两个小写字母构成的代码,<country/regioncode2> 是从 ISO 3166 派生的由两个大写字母构成的代码。例如,美国英语为“en-US”。在双字母语言代码不可用的情况中,将使用从 ISO 639-2 派生的三字母代码;例如,三字母代码“div”用于使用 Dhivehi 语言的区域。某些区域性名称带有指定书写符号的后缀;例如“-Cyrl”指定西里尔语书写符号,“-Latn”指定拉丁语书写符号。

固定区域性不区分区域性。可以使用空字符串 ("") 按名称或者按区域性标识符 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“都没有默认关联特定区域,所以上面的第四段代码会报错。

如果要设置当前线程的区域性,用下面的代码就可以正常执行:

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);
 
        }

到处,本文完成。

版权声明:

本Blog内的所有文章如非特别注明,版权均归作者个人所有,任何外部引用或摘抄请注明原文地址,未经作者授权不得用于任何以营利目的的行为,谢谢合作!

-------------------------------------------------------------------------------------------------------------------

  1. 多语言资源文件编辑插件:
  2. 此插件支持VS2005,2008,2010
  3. 和VS接合紧密,使用多语言资源文件的编辑非常简单
  4. 减少你多语言开发时的工作量
  5. 下载地址:工具下载

    -------------------------------------------------------------------------------------------------------------------

Bookmark and Share
原文地址:https://www.cnblogs.com/LifelongLearning/p/1775354.html