在.NET中,CultureInfo的CurrentCulture和CurrentUICulture属性有什么区别?

400

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

它们之间有什么区别?

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


31
请注意,微软公司明智地没有将美式英语和(英国)英式英语或其他英语的用户界面文化分开。 英语没有MUI,这意味着在英语语言的计算机上,“CurrentUICulture”始终为en-US,而不管“CurrentCulture”设置为本地化区域设置的情况如何。请谨记这一点。 - nicodemus13
11
是的,我在英国,发现CurrentCulture是'en-GB',但CurrentUICulture是'en-US'。 - Colonel Panic
2
刚刚发现了这篇详细解释的文章:https://github.com/jbe2277/waf/wiki/CurrentCulture-vs.-CurrentUICulture - RinoTom
5个回答

382

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

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

无论系统配置了什么区域选项,都将成为您的 .NET 应用程序中的“Current”值。

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

有一篇关于此主题的好文章:协调 CurrentCulture 和 CurrentUICulture


5
这可能是深入解释的一个很好的替代选择:http://forums.asp.net/post/1080435.aspx - Michael12345
@Michael12345 谢谢你的提示。我已经更新了链接。你提供的那篇文章也不错,甚至可能更好。 - Tomalak
11
那些真是糟糕的命名,因为CurrentUICulture实际上意味着当前语言区域文化,而CurrentCulture则意味着当前数据区域文化。 - Pxtl
3
@Pxtl:我会选择 CurrentFormattingCulture 而非 CurrentDataCulture。但是请注意,它们可能没有你的名字所示的那么明显不同。例如,我会认为长日期格式(D)可以包含相当多的“语言”: en-US 返回“Friday, April 6, 2018”,而 ru-RU 返回“6 апреля 2018 г.”。 - O. R. Mapper

114

以下是我用来记忆哪个该使用的简单技巧:

(date, currency, double).tostring = CurrentCulture

resource.fr-CA.resx file = currentUICulture

如果nicodemus13Colonel Panic的评论可以信任的话,那么你的技巧的第二部分似乎不应该起作用。 - O. R. Mapper

20

在同行用户提供的良好解释之外,另一个在Web应用程序开发中重要的方面是:

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

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


17

14

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

我认为这是因为日期和货币等格式更与国家本身相关联,但所显示的语言在不同国家之间通常可以互换。


确实是一个非常好的观点。尽管如此,我认为CurrentUICulture是否只设计用于中性文化。您可以成功地使用CurrentUICulture分配特定的文化,如果您在使用相同语言的某些国家的本地化方面存在差异,则这是有意义的。 - Ivaylo Slavov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接