全球化和本地化中的新增功能
更新:2010 年 5 月
本主题介绍对 .NET Framework 4 版 中的 System.Globalization 命名空间中的类和枚举进行的更改。本主题包含以下各节:
新非特定区域性
新特定区域性
更新了全球化属性值
获取当前全球化信息
字符串处理
降低了区域设置标识符使用率
非特定区域性的属性
自定义区域性的更改
未更改的功能
新非特定区域性
与 .NET Framework 3.5 中的最少 203 个区域性相比,.NET Framework 4 最少支持 354 个区域性。 其中增添了很多新区域性都是非特定区域性,目的是完成与根非特定区域性的父链。 例如,向现有区域性“因纽特语(音节,加拿大)”和“因纽特语(拉丁语,加拿大)”中添加了三个因纽特语非特定语言,如下表中所示。
区域性显示名称 |
区域性名称 |
LCID |
---|---|---|
因纽特语 |
Iu |
0x005d |
因纽特语(音节) |
iu-Cans |
0x785D |
因纽特语(音节,加拿大) |
iu-Cans-CA |
0x045D |
因纽特语(拉丁语) |
iu-Latn |
0x7C5D |
伊努伊特语(拉丁语,加拿大) |
iu-Latn-CA |
0x085D |
新特定区域性
.NET Framework 4 还引入了新的特定区域性,如新的塞尔维亚语区域性。 旧的塞尔维亚语区域性重命名为“塞尔维亚语(西里尔文,塞尔维亚和黑山(前))”和“塞尔维亚语(拉丁语,塞尔维亚和黑山(前))”,以避免显示名称冲突。 .NET Framework 中保留了这些区域性以及其现有信息,包括其区域性名称和区域性标识符。
区域性显示名称 |
区域性名称 |
LCID |
---|---|---|
塞尔维亚语 - 塞尔维亚(拉丁语) |
sr-Latn-RS |
0x241A |
塞尔维亚语 - 塞尔维亚(西里尔语) |
sr-Cyrl-RS |
0x281A |
塞尔维亚语 - 黑山(拉丁语) |
sr-Latn-ME |
0x2C1A |
塞尔维亚语 - 黑山(西里尔语) |
sr-Cyrl-ME |
0x301A |
中文区域性的显示名已发生更改以遵循以下命名约定:LanguageName ([Script,] Country/RegionName)。 在 .NET Framework 4 中,zh-CHS 和 zh-CHT 显示名称后追加了“传统用法”一词,以便区分于 zh-Hans 和 zh-Hant。 对于 Windows 中最近引入的 zh,使用“中文”作为其显示名称。
显示名称 |
区域性名称 |
LCID |
---|---|---|
中文 |
zh |
0x7804 |
中文(简体) - 传统用法 |
zh-CHS |
0x0004 |
中文(繁体) - 传统用法 |
zh-CHT |
0x7C04 |
中文(简体) |
zh-Hans |
0x0004 |
中文(繁体) |
zh-Hant |
0x7C04 |
中文(简体,中国) |
zh-CN |
0x0804 |
中文(繁体,香港特别行政区) |
zh-HK |
0x0C04 |
中文(繁体,澳门特别行政区) |
zh-MO |
0x1404 |
中文(简体,新加坡) |
zh-SG |
0x1004 |
中文(繁体,台湾) |
zh-TW |
0x0404 |
中文区域性的父链现在包含根中文区域性。 以下示例演示两个中文特定区域性的完整父链:
zh-CN → zh-CHS → zh-Hans → zh → Invariant
zh-TW → zh-CHT → zh-Hant → zh → Invariant
“藏语(中国)”、“法语(摩纳哥)”、“塔马塞特语(拉丁语,阿尔及利亚)”和“西班牙语(西班牙,国际风格)”显示名称也进行了更新。 当显示名称发生更改时,英语名称和本地化名称通常会反映这一更改;但是,ISO 和脚本缩写名称、语言以及国家/地区可能也会发生更改。
更新了全球化属性值
.NET Framework 4 还更新了全球化属性的值,例如货币、日期和时间格式、日和月名称、A.M. 和 P.M. 指示符,以及某些数字格式设置属性。 下表提供了 System.Globalization.RegionInfo 类中的货币名称更改示例。
区域性名称 |
版本 3.5 货币名称 |
版本 4 货币名称 |
---|---|---|
mt-MT |
马耳他里拉 |
欧元 |
sk-SK |
斯洛伐克克朗 |
欧元 |
sl-SI |
斯洛文尼亚托拉尔 |
欧元 |
tr-TR |
新土耳其里拉 |
土耳其里拉 |
下表提供了对 System.Globalization.DateTimeFormatInfo 类中的短日期模式进行的更改的示例。
区域性名称 |
版本 3.5 短日期模式 |
版本 4 短日期模式 |
---|---|---|
ar-SA |
dd/MM/yy |
dd/MM/yyyy |
prs-AF |
dd/MM/yy |
yyyy/M/d |
ps-AF |
dd/MM/yy |
yyyy/M/d |
pt-BR |
d/M/yyyy |
dd/MM/yyyy |
有些日历数据发生了更改,例如许多区域设置的日和月名称(例如,阿拉伯语区域设置的 DateTimeFormatInfo.ShortestDayNames 属性)。 TextInfo.IsRightToLeft 属性的某些从右到左区域设置(如 prs-AF、ps-AF 和 ug-CN)的值不正确,此版本中对此进行了修复。
获取当前全球化信息
.NET Framework 4 的一个主要的全球化功能是能够提供最新可用的信息。 此版本提供的最旧的全球化信息是在发布此本版本时可用的数据,并且只有在 Windows 7 之前的 Windows 上运行时才会这样。 当运行在 Windows 7 和更高版本上时,将直接从操作系统检索全球化信息,这意味着客户在升级到新的 Windows 时将会获得最新的全球化信息。 无论是本机应用程序 (Win32) 还是托管应用程序 (.NET),运行 Windows 7 和更高版本的客户都将获得一致的全球化体验。
由于世界始终在变化,因此全球化信息随时都可能发生改变;开发人员不应期望全球化属性的值能够在不同版本之间保持一致,甚至在 .NET Framework 的同一版本中也不可能做到这一点。 这对于 .NET Framework 用户来说并非是全新的行为。 当在不同的 Windows 版本上运行时,自 .NET Framework 2 以来一直支持的 Windows-Only-Cultures 的属性值可能会有所不同。
区域性名称是区域性信息的最稳定的属性,在将来发布的版本中也应会保持稳定。 其他属性(例如,区域性显示名称)会随时发生更改,因此,应用程序不应依赖于显示名称的拼写或任何其他文本或数值数据。
全球化信息检索机制在 .NET Framework 4 中已有所改变。 如果您的应用程序在 Windows 7 或更高版本上运行,则它将直接从操作系统检索全球化信息。 如果您的应用程序在 Windows 的早期版本(例如 Windows Vista、Windows XP、Windows Server 2003 或 Windows Server 2008)上运行,则它将从内部数据存储中检索全球化信息以确保数据最新。
在新的全球化信息检索模型中,某些 CultureTypes 的定义将发生更改,因为将根据主机操作系统从其他位置检索全球化信息。 CultureTypes 成员 WindowsOnlyCultures 和 FrameworkCultures 现已过时。 如果您尝试使用这些成员,则编译器将生成一条警告,不过编译过程仍将成功。 使用 WindowsOnlyCultures 将不会返回任何区域性,而 FrameworkCultures 则将返回所有区域性。 其他 CultureTypes 成员将与以前一样具有相同的定义。
字符串处理
许多 .NET Framework 类(包括 System.Globalization 命名空间中的 CharUnicodeInfo、CompareInfo、StringInfo、TextInfo 和 TextElementEnumerator)实现了排序、大小写和规范化规则并检索 Unicode 字符信息。 在 .NET Framework 4 中,将这些功能与 Windows 7 保持同步,这可为中文、日语和朝鲜语 (CJK) 语言提供更丰富的语言排序和大小写功能,并且还修复了客户报告的许多问题。 最重要的更改是与 Unicode 5.1 标准兼容,此标准增加了对大约 1400 个字符的支持,包括新符号、箭头、音调符号、标点、数学符号、CJK 笔划、表意文字以及马拉雅拉姆语和泰卢固语数字字符。 此外,Unicode 5.1 改进了以下现有文种中的字符的排序和大小写:拉丁语、缅甸语、阿拉伯语、希腊语、蒙古语、西里尔语、果鲁穆奇语、奥里雅语、泰米尔语、泰卢固语和马拉雅拉姆语。 它还增加了对下列新文种的支持:巽他语、列普查语、欧甘语、瓦依语、索拉什拉特语、克耶黎语、勒姜语和占语。
数据库索引等许多方案都要求不同 Windows 版本中的字符串处理行为保持一致。 .NET Framework 4 可以保证字符串处理操作对于任何主机 Windows 版本都具有一致的行为。
创建数据库索引或存储排序关键字的现有应用程序可能依赖于 .NET Framework 2.0 或 3.5 中的排序和大小写行为。 为了支持这些应用程序,.NET Framework 4 允许开发人员通过将 <CompatSortNLSVersion> 元素包含在应用程序的配置文件中来应用旧版排序和大小写行为。 此外,可以通过在配置应用程序域时调用带“NetFx40_LegacySecurityPolicy”开关的 AppDomainSetup.SetCompatibilitySwitches 方法,基于每个应用程序域应用旧版排序和大小写规则。 请注意,成功还原旧版行为依赖于本地系统上存在 sort00001000.dll 动态链接库。
.NET Framework 4 为某些区域性提供了多个排序选项。 例如,德语(德国)区域性在默认情况下将使用字典排序顺序,但支持电话簿排序作为替换排序顺序。 又如,“中文(简体,中国)”区域性支持按发音排序作为默认行为,并支持按笔画数排序作为替换排序顺序。 若要指定替换排序顺序,可以使用替换排序顺序的 LCID 或名称来创建 CultureInfo 对象。 已从 .NET Framework 4 中移除三个替换排序顺序,因为它们在 Windows 中已被弃用。尝试使用这些已弃用的替换排序顺序的 LCID 来构建 CultureInfo 对象将引发 CultureNotFoundException 异常。下表列出了 .NET Framework 支持的替换排序顺序。
区域性名称 |
语言 - 国家/地区 |
默认排序名称和 LCID |
替换排序名称和 LCID |
---|---|---|---|
zh-HK |
中文 - 香港特别行政区 |
默认:0x00000c04 |
zh-HK_stroke:0x00020c04 |
ja-JP |
日语 – 日本 |
默认:0x00000411 |
ja-JP_unicod:0x00010411 |
ko-KR |
朝鲜语 – 韩国 |
默认:0x00000412 |
ko-KR_unicod:0x00010412 |
降低了区域设置标识符使用率
在 .NET Framework 4 中,ToString 和 ToString 方法将对所有区域性使用不带 LCID 的区域性名称。 例如,.NET Framework 4 将返回“en-US CompareInfo - en-US”,而不是返回“en-US CompareInfo – 1033”,后者是早期版本的 .NET Framework 中的返回值。
非特定区域性的属性
如果应用程序尝试访问非特定区域性属性(例如,DateTimeFormatInfo.FirstDayOfWeek),则早期版本的 .NET Framework 就会引发异常。 在 .NET Framework 4 中,非特定区域性属性将返回值,这些值反映了相应非特定区域性的最具主导性的特定区域性。 例如,“法语”非特定区域设置将从“法语(法国)”检索其大多数属性的值。 FirstDayOfWeek 属性将返回 DayOfWeek.Monday,它反映该属性在“法语(法国)”区域性中对应的值。
但是,有些属性(例如,语言名)具有不同于主导区域性的值。 例如,“挪威语”非特定区域性的语言名称是“挪威语”,而“挪威语、伯克梅尔(挪威)”特定区域性的语言名称则为“挪威语(博克马尔语)”。
在 .NET Framework 4 中,非特定区域性的某些属性和方法将返回值,这些值反映特定区域性而不是非特定区域性。 CultureInfo 类中的 KeyboardLayoutId 属性和 GetConsoleFallbackUICulture 方法就是此更改的两个示例:
KeyboardLayoutId 值更改:
区域性名称
版本 3.5
版本 4
ar
1
1025
es
10
1034
fr
12
1036
zh-CHS
4
2052
GetConsoleFallbackUICulture 值更改:
区域性名称
版本 3.5
版本 4
af
af
af-ZA
de
de
de-DE
en
en
en-US
ja
ja
ja-JP
自定义区域性的更改
.NET Framework 版本 2.0 所创建的非特定替换区域性不在 .NET Framework 4 中加载。
在使用 CultureAndRegionInfoBuilder 类注册替换区域性时,自定义区域性中的重写信息将无法立即用于创建此自定义区域性的进程。 不过,在注册此自定义区域性之后启动的进程将能够读取重写信息。
未更改的功能
文本信息、编码、日历功能和国际化域名 (IDN) 功能在 .NET Framework 4 中未发生更改。 这些区域像以前一样工作。
修订记录
日期 |
修订记录 |
原因 |
---|---|---|
2010 年 5 月 |
请注意,还原旧版功能排序和比较依赖于 sort00001000.dll。 |
内容 Bug 修复 |