我有一个网络应用程序,我将CultureInfo
Thread.CurrentThread
设置为ar-IL
(阿拉伯语 - 以色列):
Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-IL")
问题是在我的本地计算机(带有IIS 10的Windows 10)上它运行正常并且没有抛出任何异常。但是,在Azure(带有IIS 8.5的Windows Server 2012 R2)上,它会抛出CultureNotFoundException
:
不支持文化。参数名称:name'ar-IL'无效 文化标识符
我检查了CultureInfo
的来源,并意识到对nativeInitCultureData()
的本地调用是罪魁祸首。在我的Windows 10计算机上,它返回true
但在Windows Server 2012上它返回false
。
此外,检查nlsinfo.cpp
文件的SSCLI会显示以下评论:
// 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
),但是需要花费太多精力来满足我计划支持的所有组合。
答案 0 :(得分:1)
是的,Windows 10能够为任何文化名称提供一些明智的信息。
自己构建文化信息是一种选择 - 只要日历信息兼容,您就可以将来自中性(" HE")文化的字符串与任何特定文化的数据合并(例如" en-US& #34)。 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
- Create custom culture in ASP.NET安装在服务器上。