多语言软件开发之new CultureInfo(“”)与CultureInfoCreateSpecificCulture(“”)的异同
在多语言资源软件制作中肯定会遇到这样的问题,如下面的代码:
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”指定拉丁语书写符号。
固定区域性不区分区域性。可以使用空字符串 ("") 按名称或者按区域性标识符 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内的所有文章如非特别注明,版权均归作者个人所有,任何外部引用或摘抄请注明原文地址,未经作者授权不得用于任何以营利目的的行为,谢谢合作!
-------------------------------------------------------------------------------------------------------------------
- 多语言资源文件编辑插件:
- 此插件支持VS2005,2008,2010
- 和VS接合紧密,使用多语言资源文件的编辑非常简单
- 减少你多语言开发时的工作量
- 下载地址:工具下载
-------------------------------------------------------------------------------------------------------------------