我想知道如何确定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。
答案 0 :(得分:2)
您无法询问用户是否更改了文化,但您可以请求未被用户更改的文化。
new CultureInfo(CultureInfo.CurrentCulture.Name, false);
或
CultureInfo::GetCultureInfo(CultureInfo.CurrentCulture.Name);
在其中任何一个中,UseUserOverrides属性都将为false。
只有默认文化可以让用户覆盖其数据。管理员可以通过安装自定义替换区域性来覆盖任何区域性中的数据。您可以通过检查CultureTypes属性是否存在CultureTypes.ReplacementCultures标志来检测到这一点。在这种情况下无法获得原始数据。
请注意,如果您实际上是在尝试编写基于此更改其行为的代码,那么您可能正在编写将在未来版本中破解的代码。由于错误已得到修复,数据会在不同版本之间发生变化。