如何获取所有Cultures以避免CultureNotFoundException

本文关键字:Cultures CultureNotFoundException 何获取 获取 | 更新日期: 2023-09-27 18:08:42

伙计们,我正在开发一个可以在多台机器上运行的应用程序。我最近在其中引入了Cultures,以支持所有货币。

我有两台主要的开发PC,我在它们之间移动代码。一个是Windows 8笔记本电脑,而另一个是Windows7 PC。

这两台机器中的SpecificCultures列表似乎是NOT相同的。当可执行文件在Windows8上运行时,会返回更多的SpecificCultures,并且还会重命名一些现有的。

我使用以下代码对所有特定文化进行文本文件转储:

StringBuilder sb = new StringBuilder();
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    sb.Append(ci.Name + "'t" + new RegionInfo(ci.LCID).CurrencyEnglishName);
    sb.AppendLine();
}
StreamWriter f = new StreamWriter(@"specificCulturesFound.txt");
f.Write(sb);
f.Close();

从我的Windows 8笔记本电脑返回的SpecificCultures是这样的:http://pastebin.com/cznLRG62从我的Windows 7 PC返回的SpecificCultures是这样的:http://pastebin.com/MwMXwSdb

如果你在Notepad++或其他东西中比较它们,你会发现它们之间的差异。

例如:例如,et-EE Estonian Kroon条目仅在我的Windows 7 PC上可用,而ku-Arab-IQ Iraqi Dinar仅在Windows 8笔记本电脑上可用

问题是,我该如何应对这种情况?一旦应用程序发布,它将在具有不同.NET框架版本的不同机器上运行。

有没有一种方法可以将所有收集到的CultureInfo数据与应用程序一起导出,这样就可以使用它,而不是从安装的.NET框架中获取它?

如何获取所有Cultures以避免CultureNotFoundException

这不是一个容易的情况,在正常情况下您的应用程序不应该意识到不同文化之间的差异,它应该意识到的只是存在差异

这通常是将所有内容保存在中性区域性中(例如,en-US区域设置(,然后转换回运行应用程序的用户的特定区域设置。例如,如果用户输入了一个日期值列表,那么保存它们的方法是将每个日期转换为其中性表示形式,并使用列表分隔符将它们连接起来(两者都使用中性区域性,因为您可以获得用户的当前区域设置,并且您知道中性区域设置(。稍后,在另一台具有不同区域设置的机器中,其他人将读取该文件,您的应用程序知道日期处于中性区域性,然后就可以读取它们,并以所需的格式将它们呈现给用户。示例:

  • 具有it-IT语言环境的用户输入两个日期:01/01/1960;25/12/2013
  • 应用程序将其存储为中性的en-US格式:01/01/1977,12/25/2013
  • 另一个具有jp-JP语言环境的用户将读取它,应用程序将读取中性语言环境并将其显示为1977/01/01・2013/12/25

当这些数据不固定时,情况会变得更加复杂,例如货币。在这种情况下,你不能简单地转换为中性值,让我们想象一下(值是非常随机的(:

  • 用户在1000 YEN中输入一个值
  • 日元转换为美元(假设100日元=1美元(:10美元,然后保存
  • 数据将在欧洲另一个使用欧元的国家读取,应用程序读取10美元,然后将其转换为10欧元

这是错误的当然是因为:

  • 更改YEN<->美元可能会从你写它的那一天起更改,也可能从它以欧元阅读的那天起更改
  • 更改YEN<->EURO不等于YEN<->美元欧元

这不是一个容易解决的问题,您不能通过CultureInfo依赖"自动"转换,但您必须自己实现(以最适合您需求的方式(。例如(当然是非常幼稚的(实现可以存储这样的货币:

struct CurrencyValue
{
    public decimal Value;
    public string Currency;
}

根据需要,这可能会很复杂(例如,使用类层次结构而不是货币而不是字符串(,但请记住,这种转换绝对不是微不足道的。

总结

不关心这种转换,只需使用中性语言环境存储所有内容,并且转换(到和从(将在用户机器中发生(在那里您不需要关心使用的是哪个语言环境(。

如果您必须管理特殊类型(如货币(,则必须实现自己的库以正确的方式处理它们。什么是"正确的方式"取决于您的全部应用程序要求,因此这里无法回答。