.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
类型的值:CurrentCulture
和 CurrentUICulture
。
它们之间有什么区别?
我应该在什么时候以及为什么使用哪一个?
【问题讨论】:
请记住,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.Threading
。
CurrentCulture
在会话中的不同请求中保持不变,而 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 属性有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
新 CultureInfo(string Name) 构造函数 - .NET (C#)
如何在 ASP .NET MVC 中使用 Resources 和 CultureInfo 更改站点语言?