为CultureInfo使用自定义的语言和地区组合

本文关键字:语言 地区 组合 自定义 CultureInfo | 更新日期: 2023-09-27 18:11:57

我有一个web应用程序,我将Thread.CurrentThread上的CultureInfo设置为ar-IL(阿拉伯-以色列):

Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-IL")

问题是,在我的本地机器上(Windows 10与IIS 10),它工作得很好,没有抛出异常。然而,在Azure (Windows Server 2012 R2 with IIS 8.5)上,它抛出CultureNotFoundException:

不支持

区域性。参数名称:name 'ar-IL'无效文化标识符

我检查了CultureInfo的源代码,意识到对nativeInitCultureData()的本机调用是罪魁祸首。在我的Windows 10机器上,它返回true,但在Windows Server 2012上,它返回false

同样,检查SSCLI中的nlsinfo.cpp文件会显示以下注释:

// Call GetLocaleInfoEx and see if the OS knows about it.
// Note that GetLocaleInfoEx has variations:
// * Pre-Vista it fails and has to go downlevel
// * Vista succeeds, but not for neutrals
// * Win7 succeeds for all locales.
// * Mac does ???

那么,我如何处理不被Windows识别的语言和地区(ar-IL, he-US等)的自定义组合?

p。S我知道创建和注册自定义语言环境(使用CultureAndRegionInfoBuilder)的可能性,但要满足我计划支持的所有组合需要太多的努力。

为CultureInfo使用自定义的语言和地区组合

是的,Windows 10能够为任何区域性名称提供一些合理的信息。

自己构建文化信息是一个选项-只要日历信息兼容,您可以将中性("HE")文化中的字符串与任何特定文化(如"en-US")的数据合并。CultureAndRegionInfoBuilder可以用来安全地组合信息,如MSDN示例所示:

  // Create a custom culture for ru-US.
  CultureAndRegionInfoBuilder car1 = new CultureAndRegionInfoBuilder("ru-US", 
                                         CultureAndRegionModifiers.None);
  car1.LoadDataFromCultureInfo(CultureInfo.CreateSpecificCulture("ru-RU"));
  car1.LoadDataFromRegionInfo(new RegionInfo("en-US"));

或者,您可以构建XML文件来定义您需要支持的区域性,并在运行时加载它们,甚至使用CultureAndRegionInfoBuilder.Register在ASP.NET中创建自定义区域性安装在服务器上。