电流文化、不变文化、电流文化与安装文化的区别

CurrentCultureInvariantCultureCurrentUICultureInstalledUICultureSystem.Globalization.CultureInfo有什么不同?

40304 次浏览

我会试着给出一个比 这个更有见地的答案。

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);

需要注意的一件重要的事情是,你从一开始就不应该使用 float或者 double来存储货币相关的信息(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可互换日期及时间格式。由于某些原因,微软甚至没有提供这样的模式(最接近的模式是 Sortable pattern-s 和 Universal pattern-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 负责为应用程序加载适当的可翻译资源。也就是说,它应该用于显示正确的文本信息,颜色和图像。
在阿斯珀。Net 应用程序如果出于某种原因想要实现 CSS 本地化机制(能够覆盖每种语言的 CSS 定义) ,那么 CurrentUICulture是一个很好的选择(前提是你实际上是从 web 浏览器中读取这个属性)。
同样,如果您希望实现语言切换机制,则应该重写 CurrentUICulture


InstalledUICulture 连接到默认 OS UI Locale:

此属性与 WindowsAPI 中的 GetSystemDefaultUILlanguage 等效。

要真正理解这个属性是什么,我们需要深入研究一些理论:

  • 单一语言(即英语、法语、德语、日语等)
  • MUI (多语言用户接口-以英语为基础的操作系统和语言包)

对于单语言产品线,InstalledUICulture 总是返回操作系统语言,而对于 MUI,它总是返回 English (United States) aka en-US。有用吗?我不知道,我从来不需要这样的信息。就我个人而言,我还没有看到利用这一财产的程序。

摘自 这个答案:

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

CurrentUICulture 引用默认的用户界面语言,即 在 Windows2000中引入的设置。这主要是关于用户界面 应用程序的本地化/翻译部分。

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

很多时候它们都是一样的,但是在我的系统里它们是一样的 不同: 我更喜欢使用德文格式的数字和日期,因此 CurrentCulture 应该是德语的,但是我更喜欢我所有的应用程序 所以 CurrentUICulture 应该是英语。