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

时间:2015-09-08 14:25:30

标签: c# .net azure cultureinfo

我有一个网络应用程序,我将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-ILhe-US等)的自定义组合?

P.S我知道有可能创建和注册自定义区域设置(使用CultureAndRegionInfoBuilder),但是需要花费太多精力来满足我计划支持的所有组合。

1 个答案:

答案 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安装在服务器上。