CultureAndRegionInfoBuilder

本文提供了此 API 参考文档的补充说明。

注意

CultureAndRegionInfoBuilder 类仅适用于 Windows 操作系统。 非 Windows 操作系统不支持生成的 .nlp 文件。 此外,即使在 Windows 上,生成的 .nlp 文件也仅在 .NET Framework 上受支持(在使用 NLS 全球化模式时在 .NET Core 中)。

CultureInfo 类保存特定于区域性的信息,例如关联的语言、子语言、国家/地区、日历和文化习俗。 此类还提供了 DateTimeFormatInfoNumberFormatInfoCompareInfoTextInfo 类的特定于区域性的实例,这些实例是特定于区域性的操作(例如,确定大小写、格式化和分析日期和数字,以及比较字符串)所必需的。

默认情况下,.NET 支持表示预定义区域性集的 CultureInfo 对象。 有关 Windows 系统上可用的这些区域性的列表,请参阅 Windows 支持的语言/区域名称列表中的“语言标记”列。 列名遵循 BCP 47 定义的标准。 使用 CultureAndRegionInfoBuilder 类,你可以创建全新的或将替代预定义区域性的自定义区域性。 当自定义区域性在特定计算机上安装并注册后,它将无法与预定义的 CultureInfo 对象进行区分,并且可以像这些对象一样实例化和使用。

重要

CultureAndRegionInfoBuilder类位于名为sysglobl.dll程序集中。 若要成功编译使用此类型的代码,必须添加对 sysglobl.dll的引用。

自定义区域性只能由在计算机上具有管理权限的用户在该计算机上进行注册。 因此,应用通常不会创建和安装自定义区域性。 相反,你可以使用 CultureAndRegionInfoBuilder 类创建一个专用工具,供管理员用来创建、安装和注册自定义区域性。 在计算机上注册自定义区域性后,你可以在应用中使用 CultureInfo 类来创建自定义区域性的实例,就像对预定义区域性所做的那样。

如果你分析为自定义区域性生成的日期和时间字符串,则应使用 DateTime.ParseExactDateTime.TryParseExact 方法而非 DateTime.ParseDateTime.TryParse 方法,以提高分析操作的成功概率。 自定义区域性的日期和时间字符串可能比较复杂,因此难以分析。 ParseTryParse 方法尝试使用几个隐式分析模式分析字符串,所有这些模式都可能会失败。 相反,TryParseExact 方法要求应用程序显式指定一个或多个可能会成功的精确解析模式。

定义和创建自定义区域性

可以使用 CultureAndRegionInfoBuilder 类定义和命名自定义区域性。 自定义区域性可以是全新的区域性、基于现有区域性的新区域性(即补充区域性)或者是将替代现有 .NET 区域性的区域性。 在每种情况下,基本步骤都是相同的:

  1. 通过调用 CultureAndRegionInfoBuilder 对象的 CultureAndRegionInfoBuilder(String, CultureAndRegionModifiers) 构造函数来实例化该对象。 若要替换现有的区域性,请将该区域性的名称和 CultureAndRegionModifiers.Replacement 枚举值传递给该构造函数。 若要创建新的区域性或补充区域性,请传递唯一的区域性名称和 CultureAndRegionModifiers.NeutralCultureAndRegionModifiers.None 枚举值。

    注意

    如果你使用 CultureAndRegionModifiers.Replacement 枚举值来实例化 CultureAndRegionInfoBuilder 对象,则会自动使用要替换的 CultureInfo 对象中的值填充 CultureAndRegionInfoBuilder 对象的属性。

  2. 如果要创建新的或补充区域性,请执行以下操作:

  3. 根据需要修改 CultureAndRegionInfoBuilder 对象的属性。

  4. 如果你计划在单独的例程中注册自定义区域性,请调用 Save 方法。 这会生成一个 XML 文件,你可以在单独的自定义区域性安装例程中加载和注册该文件。

注册自定义区域性

如果你正在为自定义区域性开发一个注册应用程序,并且该注册应用程序与创建区域性的应用程序是分开的,则你可以调用 CreateFromLdml 方法来加载包含自定义区域性定义的 XML 文件并实例化 CultureAndRegionInfoBuilder 对象。 若要处理注册,请调用 Register 方法。 要想注册成功,则注册自定义区域性的应用程序必须在目标系统上以管理权限运行;否则,对 Register 的调用将引发 UnauthorizedAccessException 异常。

警告

区域性数据可能因系统而异。 如果你使用 CultureAndRegionInfoBuilder 类创建在多个系统之间统一的自定义区域性,并且通过从现有 CultureInfoRegionInfo 对象加载数据并对其进行自定义来创建自定义区域性,则应开发两个不同的实用工具。 第一个实用工具创建自定义区域性,并将其保存到一个 XML 文件中。 第二个实用工具使用 CreateFromLdml 方法从 XML 文件中加载自定义区域性,并将其注册到目标计算机上。

注册过程将执行以下任务:

  • 创建一个 .nlp 文件,其中包含对象中 CultureAndRegionInfoBuilder 定义的信息。
  • .nlp 文件存储在目标计算机上的 %windir%\Globalization 系统目录中。 这使自定义区域性的设置能够在会话之间保持不变。 (此方法 CultureAndRegionInfoBuilder 需要管理权限,因为 .nlp 文件存储在系统目录中。
  • 准备 .NET 以在下次请求创建新的自定义区域性时搜索 %windir%\Globalization 系统目录,而不是搜索内部缓存。

成功注册自定义区域性后,无法将其与 .NET 预定义的区域性进行区分。 自定义区域性可用,直到对方法的调用 CultureAndRegionInfoBuilder 从本地计算机中删除 .nlp 文件。

实例化自定义区域性

可以通过以下方式之一创建自定义区域性的实例:

此外,CultureInfo.GetCultures 方法返回的 CultureInfo 对象的数组包括自定义区域性。