日期:2010-12-14 浏览次数:20366 次
一.基本概念
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 | 0x | 繁体中文 |
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”(繁体中文)均为非特定区域性。
区