2

我住在多米尼加共和国,几年来一直在使用 .NET Framework 开发应用程序。通常,我会为这种特定的文化 ( es-DO) 创建本地化应用程序,使用内置的 .NET 全球化机制对我很有帮助。对于 Web 应用程序,我通常在 Web.Config 中定义全局文化:

<globalization culture="es-DO" uiCulture="es-DO" />

但是对于那种文化,有一个问题ShortDatePatternDateTimeFormat我和其他开发人员感到困惑。由于未知原因,默认ShortDatePattern格式d/M/yy实际上是该国家/地区使用的常规格式,dd/MM/yyyy并且dd-MM-yyyy与大多数其他西班牙语国家一样(顺便说一句,配置正确)。

我创建了一个小型控制台应用程序来更好地说明:

西班牙语文化 ShortDatePattern

我已经在几台 PC 上确认了相同的行为,甚至将我的 Web 应用程序发布到了 Windows Azure 等托管服务提供商。

我一直在寻找有关该主题的信息,但对于这种特定的(并且我可能会添加的不太受欢迎的)文化,这似乎是一个非常本地化的问题,因此很难找到任何文档。

基本上,我对此有两个问题:

  • 他们如何知道正确的文化格式?他们做了什么研究?这是否记录在我可以查看的某个地方?和,
  • 是否可以解决此问题而不必在我的应用程序中的任何地方指定所需的格式?

编辑

现在,这已在Microsoft ConnectVisual Studio 论坛中报告为一个错误。

4

3 回答 3

3

他们如何知道正确的文化格式?他们做了什么研究?这是否记录在我可以查看的某个地方?

是否可以解决此问题而不必在我的应用程序中的任何地方指定所需的格式?

  • 当然,只需更改当前线程上的文化:

    var currentCulture = Thread.CurrentThread.CurrentCulture;
    if (currentCulture.Name == "es-DO")
    {
        var culture = (CultureInfo) currentCulture.Clone();
        culture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
        Thread.CurrentThread.CurrentCulture = culture;
    }
    
  • 在 web 应用程序中,您可以在Application_BeginRequestglobal.asax.cs 文件中执行此操作,它将贯穿您的整个应用程序。

于 2013-09-14T17:31:41.140 回答
2

您可以尝试使用这些工具来创建自定义文化

我之前没有详细做过,但看起来你可以覆盖es-DO指向的内容。

请注意,这只会涵盖服务器端,而不是客户端(javascript)。

于 2013-09-11T19:37:57.587 回答
2

.Net 从 Windows 获取数据(至少从 .Net 4.0 开始就有——即使在以前的版本中,唯一的区别在于最终的默认数据)。使用 LCTYPE 为LOCALE_SSHORTDATE调用GetLocaleInfoEx会返回短日期模式。

返回适当数据的过程有效(有优化)检查请求的语言环境名称(在您的情况下为“es-DO”)是否是当前用户语言环境,如果是,则检查是否存在用户请求覆盖该值。如果有,则返回,如果没有,则如果安装了替换默认数据的自定义区域性,则返回该数据。最后,返回默认提供的数据。

默认数据是 Microsoft 维护的内部数据库的一部分。该数据库已经维护了很长时间,并由国家语言专家定期审查。如果您看到一些看起来不正确的东西并且您是母语人士,您应该将其报告为错误。有时,合法地表达数据的方式不止一种,而发言者本身对于哪种方式是“正确的”方式存在分歧。这就是为什么用户可以覆盖用户区域设置的默认值。

有几个选项可以解决这个问题:

  1. 当 es-DO 是用户区域设置时,更改短日期的用户默认值(语言和区域控制面板)
  2. 创建替代 es-DO 的自定义文化
  3. 在您的代码中,选择一个包含 4 位数年份的模式。(您期望的模式在数据中,但不是默认模式)

如果您选择最后一个,您将需要查看DateTimeFormatInfo.GetAllDateTimePatterns方法。使用“d”格式获取所有短日期格式,然后您可以找到第一个包含“yyyy”的格式。

于 2013-09-18T17:56:19.290 回答