【问题标题】:How to detect if CurrentCulture has been customised by the user?如何检测 CurrentCulture 是否已被用户自定义?
【发布时间】:2023-03-29 22:08:02
【问题描述】:

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

我使用以下 LINQPad sn-p 和 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");

我在区域对话框中选择英语(南非)作为我的格式,我的 sn-p 报告如下。

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 小时时间。 sn-p 现在报告这个。

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。

【问题讨论】:

  • 我认为您可以简单地比较 CurrentCulture 和文化之间所有需要的值,您为与当前相同的语言环境创建
  • 为什么?理想情况下,您的应用程序不应依赖于用户在其机器上设置的文化。
  • 是的@Sinatr,我可以比较属性,但是 CultureInfo 类非常丰富,我想它肯定能够给我这些信息。
  • @Grzenio,你从来没有问过一个问题只是为了知道答案吗?
  • @SteveCrane,很公平:)。我只是倾向于花太多时间处理遗留代码。

标签: c# .net cultureinfo regional-settings currentculture


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2012-09-21
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多