为国家、语言组合创建自定义 CultureInfo

Posted

技术标签:

【中文标题】为国家、语言组合创建自定义 CultureInfo【英文标题】:creating custom CultureInfo for country, language combination 【发布时间】:2012-10-16 14:26:49 【问题描述】:

我正在开发一个需要多语言支持多文化等的 .net 4.5 应用程序。

以下是国家/语言的示例列表

俄罗斯/俄罗斯 比利时/法国 比利时/荷兰

对于以上所有内容,有一个 CultureInfo 对象可以根据上述文化名称创建

ru-RU 法国-BE nl-BE

当用户进入网站时,我将 Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture 设置为使用上述名称创建的文化,例如。

Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-BE", false)
Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-BE", false)

以上所有名称都是有效的文化名称。

不,但是我需要添加另一个文化名称,即俄罗斯的英语语言。但问题是代码 en-RU 无效,所以当我创建 new CultureInfo("en-RU", false) 时,我得到一个 CultureNotFoundException,因为 en-RU 无效。

在这种文化下,我想要俄罗斯的数字、日期等格式,但我希望网站上的语言是英语。是否可以根据国家(俄罗斯)的行为为无效的文化名称创建自定义 CultureInfo 对象?

【问题讨论】:

【参考方案1】:

是否可以为无效的文化名称创建自定义 CultureInfo 对象

是的。

利用CultureAndRegionInfoBuilder 来帮助创建自定义CultureInfo。 (注意。一旦您有了创建文化的代码,可以将执行此操作的设置保存到 XML,然后加载,例如从资源中加载,这在运行时需要更少的代码。)

一个示例项目如何做到这一点,加上可下载的代码,可以be found at CodeProject。文章中的一个重要说明是,即使此类位于 System.Globalization 命名空间中,默认情况下它也不可用,引用:

我们将从引用程序集 sysglobl.dll 开始,并为命名空间 System.Globalization 添加一个 using 语句。

【讨论】:

Here's 一个很好的教程。它是为 .NET 2.0 编写的,因此如果您使用的是较新版本的 .NET,您可能需要检查它是否未被弃用。 @dario_ramos 链接失效了,很遗憾 @Sam,很遗憾听到这个消息。这是the last archived version.请耐心等待加载时间:P 也可以在here 找到类似的文章。显然,它取自一本书的一章。 CultureAndRegionInfoBuilder 在 4.6 中不再可用!?【参考方案2】:

您可能需要混合搭配 - 有一个用于英语的文化对象,用于英语文本,但有一个用于数字格式的 ru-Ru(俄语)文化对象。

或者甚至更好地创建一种将两者结合起来的自定义文化

Create custom culture in ASP.NET

【讨论】:

这个答案是第一个并链接到适当的 SO 文章。这应该是答案。【参考方案3】:

你应该使用CultureInfo.InvariantCulture属性

不变的文化是文化不敏感的;它与 英语,但不与任何国家/地区。您指定 通过在对 CultureInfo 实例化方法。 CultureInfo.InvariantCulture 也 检索不变区域性的实例。它可以用于 System.Globalization 命名空间中几乎所有需要的方法 一种文化。 CompareInfo 等属性返回的对象, DateTimeFormat 和 NumberFormat 也反映了字符串比较 和不变文化的格式约定。

CultureInfo.InvariantCulture Property

这是另一个选项Custom Global Application Culture

【讨论】:

你没看懂问题。

以上是关于为国家、语言组合创建自定义 CultureInfo的主要内容,如果未能解决你的问题,请参考以下文章

每个国家/地区的 CultureInfo 名称

获取一个国家的默认时区(通过 CultureInfo)

为啥不是所有国家都出现在 CultureInfo.GetCultures() 中?

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

通过寄生组合式继承创建js的异常类

在 CultureInfo 中获取当前语言