为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
)的可能性,但要满足我计划支持的所有组合需要太多的努力。
是的,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中创建自定义区域性安装在服务器上。