.NET 中 CultureInfo 的 CurrentCulture 和 CurrentUICulture 属性有啥区别?

Posted

技术标签:

【中文标题】.NET 中 CultureInfo 的 CurrentCulture 和 CurrentUICulture 属性有啥区别?【英文标题】:What is the difference between CurrentCulture and CurrentUICulture properties of CultureInfo in .NET?.NET 中 CultureInfo 的 CurrentCulture 和 CurrentUICulture 属性有什么区别? 【发布时间】:2010-09-24 15:34:36 【问题描述】:

在 .NET 中,System.Globalization 命名空间中有 CultureInfo 类。它有两个相似的属性,都返回 CultureInfo 类型的值:CurrentCultureCurrentUICulture

它们之间有什么区别?

我应该在什么时候以及为什么使用哪一个?

【问题讨论】:

请记住,Microsoft 不会将美国英语和(英国)英语或其他英语的 UI 文化分开。英语没有 MUI,这意味着在英语机器上,CurrentUICulture 将始终是 en-US,而不管 CurrentCulture,可以设置为本地化区域设置。 是的。我在英国,发现 CurrentCulture 是“en-GB”,但 CurrentUICulture 是“en-US”。 刚刚发现这篇文章详细解释了这一点:github.com/jbe2277/waf/wiki/CurrentCulture-vs.-CurrentUICulture 【参考方案1】:

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

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

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

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

关于这个话题有一篇不错的文章:Sorting it all Out: Why we have both CurrentCulture and CurrentUICulture

【讨论】:

其实这可能是一个很好的深入解释的替代方案:forums.asp.net/post/1080435.aspx @Michael12345 感谢您的提示。我已经更新了链接。您链接到的帖子也不错,甚至可能更好。 那些名字太糟糕了,因为 CurrentUICulture 真的意味着 CurrentLanguageCulture 而 CurrentCulture 真的意味着 CurrentDataCulture。 @Pxtl:我会选择 CurrentFormattingCulture 而不是 CurrentDataCulture。不过,请注意,这些可能并不像您的名字所暗示的那样明显脱节。例如,我认为长日期格式 (D) 可以包含相当多的“语言”:en-US 返回“Friday, April 6, 2018”,而 ru-RU 返回“6 апреля 2018 г.”。 【参考方案2】:

这是我用来记住要使用哪一个的简单技巧:

(date, currency, double).tostring = CurrentCulture

resource.fr-CA.resx file = currentUICulture

【讨论】:

如果 nicodemus13 和 Colonel Panic 的 cmets 是可信的,那么你的技巧的第二部分似乎不应该奏效。【参考方案3】:

区别:

    CurrentCulture 用于格式化日期和货币,而CurrentUICulture 用于语言/翻译。 ResourceManager 将使用它来按文化查找资源。 CurrentCulture 类的命名空间在 System.Globalization 中,而 CurrentUICulture 来自 System.ThreadingCurrentCulture 在会话中的不同请求中保持不变,而 CurrentUICulture 需要为每个请求设置。

相似之处:

它们都是System.Globalization.CultureInfo 实例。

【讨论】:

【参考方案4】:

除了其他用户的精彩解释之外,还有一个很好的方式来有所作为,而 Web 应用程序开发的一个重要方面如下:

CurrentCulture 表示 Web 服务器的设置。例如,如果您的 ASP.NET Web 应用程序托管在德国,则 CutlureInfo.CurrentCulture 的值很可能是 de-DE。因此,IFormattable 类型的默认 .ToString() 格式将使用默认的德语格式,或者已在服务器操作系统上设置为默认的格式。

CurrentUICulture 可以从用户代理中捕获,并且可能代表连接到网站的客户端的用户界面文化。例如,如果您从俄罗斯加载该网站,您的本地设置设置为使用俄语,并且您的用户代理将您的区域设置发送到服务器(Opera 和 IE 会自动执行此操作,对于 Chrome 和 FireFox 不确定),@ 987654327@ 将代表ru-RU。这将导致任何资源(如通过 ResourceManager 检索的本地化字符串或 ASP.NET aspx/ascx 文件中的本地化表达式)为俄语(如果有翻译)。

【讨论】:

【参考方案5】:

值得注意的是,CurrentUICulture 支持非特定国家/地区的语言环境,例如“en”(中性文化),而 CurrentCulture 仅支持特定国家/地区的语言环境,例如“en-GB”。将CurrentCulture 设置为中性文化会抛出ArgumentException

我认为这是因为日期和货币等格式与国家/地区本身的联系更紧密,但显示的语言通常可以在国家/地区之间互换。

【讨论】:

确实是一个很好的观点。尽管如此,我会争论CurrentUICulture 是否被设计为仅用于中性文化。您可以使用 CurrentUICulture 成功分配特定的文化,如果您在使用相同语言的某些国家/地区的本地化方面存在差异,这将是有意义的。

以上是关于.NET 中 CultureInfo 的 CurrentCulture 和 CurrentUICulture 属性有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

在.net应用程序cultureInfo中覆盖数字格式

新 CultureInfo(string Name) 构造函数 - .NET (C#)

如何在 ASP .NET MVC 中使用 Resources 和 CultureInfo 更改站点语言?

当前文化在 WinRT 中是错误的

如何从 .NET 中的 CultureInfo 获取 ISO 3166 国家代码

CultureInfo:海地克里奥尔语和 ASP.NET/MVC 上的 .NET 3.5?