CurrentCulture,InvariantCulture,CurrentUICulture和InstalledUICulture之间的区别

时间:2011-02-20 22:16:02

标签: .net internationalization globalization

来自CurrentCulture的{​​{1}},InvariantCultureCurrentUICultureInstalledUICulture之间的区别是什么?

2 个答案:

答案 0 :(得分:105)

我会尝试提供比this one更有见地的答案。

CurrentCulture 应该用于格式化。也就是说,数字,货币,百分比,日期和时间始终始终使用此文化进行格式化,然后将其显示给用户。这里几个例子:

const string CURRENCY_FORMAT = "c";
const string PERCENTAGE_FORMAT = "p";

DateTime now = DateTime.UtcNow; // all dates should be kept in UTC internally
// convert time to local and format appropriately for end user
dateLabel.Text = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);

float someFloat = 12.3456f;
// yields 12,3456 for pl-PL Culture
floatLabel.Text = someFloat.ToString(CultureInfo.CurrentCulture);
// yields 12,35 zł for pl-PL Culture - rounding takes place!
currencyLabel.Text = someFloat.ToString(CURRENCY_FORMAT, CultureInfo.CurrentCulture);
// yields 1234,56% for pl-PL Culture - 1.0f is 100%
percentageLabel.Text = someFloat.ToString(PERCENTAGE_FORMAT, CultureInfo.CurrentCulture);

需要注意的一点是,您不应该首先使用floatdouble来存储与货币相关的信息(decimal是正确的选择)。
CurrentCulture的另一个常见用例是区域设置感知解析。您的应用程序始终允许用户以其区域格式提供输入:

float parsedFloat;
if (float.TryParse(inputBox.Text, NumberStyles.Float, CultureInfo.CurrentCulture, out parsedFloat))
{
    MessageBox.Show(parsedFloat.ToString(CultureInfo.CurrentCulture), "Success at last!");
}

请注意,我始终提供IFormatProvider参数,但隐含并假设为CultureInfo.CurrentCulture。原因是,我想与其他开发人员沟通:这是将向最终用户显示的内容。这是FxCop将此参数省略为错误的原因之一。


另一方面,

InvariantCulture 应该可靠地将上述类之一转换为其文本表示。因此,如果您想通过网络传输DateTimefloatdouble或类似对象,将其存储到数据库或某种文本文件(包括XML),您应该始终使用InvariantCulture

float someFloat = 1234.56f;
// yields 1234.56
string internalFloat = someFloat.ToString(CultureInfo.InvariantCulture);
DateTime now = DateTime.UtcNow;
// yields something like 04/16/2011 19:02:46
string internalDateAndTime = now.ToString(CultureInfo.InvariantCulture);

这里要注意的是InvariantCulture提供的日期/时间格式实际上与en-US完全相同。虽然它是可靠的,但它并不完全正确。真正应该使用的是ISO8601 Interchangeable Date & Time Format。出于某种原因,微软甚至没有提供这样的模式(最接近的是可排序模式 - “s”和通用模式 - “u”,它只类似于ISO8601格式),你需要创建自己的模式:

const string iso8601Pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
string iso8601Formatted = now.ToString(iso8601Pattern);

非常重要的注意事项:IFormatProvider实际上是必需,因为省略此参数可能会导致严重错误。我曾经不得不修复法语操作系统的缺陷。代码是这样的:

float dbVersion = // some kind of logic that took float from database
string versionString = dbVersion.ToString(); // culture-aware formatting used
Version ver = new Version(versionString); // exception thrown here

原因很简单:在法语操作系统上格式化的浮点数(带有法语区域格式)格式化为类似10,5和Version类需要文化不变输入。


CurrentUICulture 负责为您的应用程序加载适当的可翻译资源。也就是说,它应该用于显示正确的文字信息,颜色和图像 在Asp.Net应用程序中,如果您出于某种原因希望实现CSS本地化机制(能够覆盖每种语言的CSS定义),CurrentUICulture是一种很好的方法(假设您实际上是从Web浏览器中读取此属性)。登记/> 同样,如果要实现语言切换机制,CurrentUICulture是应该被覆盖的那个。


InstalledUICulture 连接到默认操作系统UI区域设置。正如MSDN所说:

  

此属性相当于Windows API中的GetSystemDefaultUILanguage。

要真正理解这个属性是什么,我们需要深入研究一些理论。有不同的Windows产品系列:

  • 单一语言(即英语,法语,德语,日语等)
  • MUI(即多语言用户界面 - 基于英语的操作系统和语言包)

对于单语言产品系列,InstalledUICulture将始终返回操作系统语言,而对于MUI,它应始终返回英语(美国),即en-US。它有用吗?我不知道,我从来不需要这样的信息。我个人没有看到利用这个属性的程序。

答案 1 :(得分:3)

取自this answer

  

CurrentCulture是默认用户区域设置的.NET表示形式   系统的。这可以控制默认数字和日期格式   之类的。

     

CurrentUICulture是指默认的用户界面语言,a   在Windows 2000中引入的设置。这主要是关于UI   您应用的本地化/翻译部分。

     

系统配置的任何区域选项都将是   .NET应用程序中的“当前”值。

     

它们通常都是相同的。但在我的系统上他们会   不同:我更喜欢德国格式的数字和日期,所以   CurrentCulture将是德语,但我也更喜欢我的所有应用程序   在英语中,所以CurrentUICulture将是英语。