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

13

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

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

  • 俄罗斯 / 俄语
  • 比利时 / 法语
  • 比利时 / 荷兰语

对于上述所有情况,都可以基于这些文化名称创建 CultureInfo 对象。

  • ru-RU
  • fr-BE
  • nl-BE

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

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 对象来代替无效的区域设置名称,并具有俄罗斯的行为特征?

3个回答

8
可以创建自定义的CultureInfo对象来代替无效的文化名称。
使用CultureAndRegionInfoBuilder帮助创建自定义CultureInfo。(注意,一旦您有了创建文化的代码,可以将此设置保存为XML,然后从资源加载,这应该需要更少的运行时代码。)
可以在CodeProject上找到一个示例项目及可下载的代码,从文章中重要的一点是,尽管此类位于System.Globalization命名空间中,但默认情况下不可用,引用程序集sysglobl.dll并添加using语句以使用该命名空间。

1
这是一个很好的教程,可以帮助你完成这个任务。它是针对.NET 2.0编写的,所以如果你正在使用更新版本的.NET,你可能需要检查一下它是否已经过时。 - dario_ramos
@dario_ramos 很遗憾,链接已失效。 - sam hocevar
@Sam,很抱歉听到这个消息。这是最后一个存档版本。加载时间可能会有点长,请耐心等待 :P - dario_ramos
同样的文章也可以在这里找到。显然,它是从一本书的章节中摘录出来的。 - Bobson
CultureAndRegionInfoBuilder在4.6中不再可用了!? - bunjeeb
@bunjeeb 注意它所在的程序集:默认情况下不包含在项目模板中。 - Richard

6

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

或者更好的方法是创建一个组合两种文化的自定义Culture对象。

在ASP.NET中创建自定义Culture对象


这个答案是第一个,并且链接到了一个合适的SO文章。这个答案值得成为最佳答案。 - Totero

-1

您应该使用 CultureInfo.InvariantCulture 属性

不变文化是与语言相关但与任何国家/地区无关的文化。您可以通过在 CultureInfo 实例化方法的调用中使用空字符串("")来按名称指定不变文化。CultureInfo.InvariantCulture 也检索不变文化的实例。它可以在几乎所有需要文化的 System.Globalization 命名空间中的方法中使用。由 CompareInfo、DateTimeFormat 和 NumberFormat 等属性返回的对象还反映了不变文化的字符串比较和格式约定。

CultureInfo.InvariantCulture Property

这是另一个选项 自定义全局应用程序文化


2
你没有理解这个问题。 - Elmue

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