5

我想知道如何确定 CultureInfo.CurrentCulture 返回的 CultureInfo 实例是否具有所有默认值,或者是否已由用户自定义。

我已经使用以下 LINQPad 片段和 LINQPad 命令行运行器进行了一些测试。

var ci = CultureInfo.CurrentCulture;
var dtf = ci.DateTimeFormat;

ci.Name.Dump("CultureInfo");
dtf.FullDateTimePattern.Dump("FullDateTimePattern");
dtf.LongDatePattern.Dump("LongDatePattern");
dtf.LongTimePattern.Dump("LongTimePattern");

我在区域对话框中选择英语(南非)作为我的格式,我的代码段报告了以下内容。

E:\Junk>lprun CurrentCulture.linq
CultureInfo: en-ZA
FullDateTimePattern: dd MMMM yyyy hh:mm:ss tt
LongDatePattern: dd MMMM yyyy
LongTimePattern: hh:mm:ss tt

然后我将长日期格式更改为隐藏当天的前导零,并将长短时间更改为 24 小时时间。该片段现在报告了这一点。

E:\Junk>lprun CurrentCulture.linq
CultureInfo: en-ZA
FullDateTimePattern: d MMMM yyyy HH:mm:ss
LongDatePattern: d MMMM yyyy
LongTimePattern: HH:mm:ss

尽管文化名称保持不变,但我更改的属性向我展示了新值。

我的问题是是否有一个属性或方法可以告诉我 CurrentCulture 返回的文化是否已从其默认值(在本例中为 en-ZA)更改。我认为 CultureInfo.UseUserOverride 可能是该属性,但在任何一种情况下它都会返回 true。

4

1 回答 1

5

您不能询问用户是否更改了文化,但您可以请求用户未更改的文化。

new CultureInfo(CultureInfo.CurrentCulture.Name, false);

或者

CultureInfo::GetCultureInfo(CultureInfo.CurrentCulture.Name);

在其中任何一个中,UseUserOverrides 属性都将为 false。

只有默认区域性可以让用户覆盖其数据。管理员可以通过安装自定义替换文化来覆盖任何文化中的数据。您可以通过检查 CultureTypes 属性来检测 CultureTypes.ReplacementCultures 标志的存在。在这种情况下,无法获取原始数据。

请注意,如果您实际上正在尝试编写基于此更改其行为的代码,那么您可能正在编写将被未来版本破坏的代码。随着错误的修复,数据确实会在版本之间发生变化。

于 2014-01-22T18:25:19.547 回答