36

该类CultureInfo提供了两种创建方式:

两者的 MSDN 文档确实略有不同,其中提到了构造函数的一些“Windows 文化”。但这真的重要吗?

我应该更喜欢两者中的一个吗?

注意:如果重要的话,我使用的是 .NET 3.5 版,我想像这样使用它:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

本答案所述。

4

3 回答 3

32

当无法创建文化信息时,工厂方法有一个备用方法。

因此,如果您使用像“en-XX”这样的特定文化,则无法创建文化信息实例,将抛出异常,并且使用中性文化“en”重试将成功。

下面是工厂方法的源码

public static CultureInfo CreateSpecificCulture(string name)
{
    CultureInfo info;
    try
    {
        info = new CultureInfo(name);
    }
    catch (ArgumentException)
    {
        info = null;
        for (int i = 0; i < name.Length; i++)
        {
            if ('-' == name[i])
            {
                try
                {
                    info = new CultureInfo(name.Substring(0, i));
                    break;
                }
                catch (ArgumentException)
                {
                    throw;
                }
            }
        }
        if (info == null)
        {
            throw;
        }
    }
    if (!info.IsNeutralCulture)
    {
        return info;
    }
    return new CultureInfo(info.m_cultureData.SSPECIFICCULTURE);
}

所以我更喜欢工厂方法。

于 2012-08-30T09:43:29.277 回答
7

这个线程已经得到了回答,但我发现了 CreateSpecificCulture API 的一个独特发现,它有时可能不那么明显。所以我认为这个线程是我发现的一个合适的地方。我为此花了几天时间,所以只想分享我的经验,如果它也可以为其他人节省几个小时或几天。

在使用 API 时,仅传递文化名称(如pt(葡萄牙语)或de(德语))时,此 API 返回与区域设置相对应的特定文化,该区域被称为该文化的默认区域设置。现在这个语言环境可能不像听起来我卡住的地方那么明显了。对于德语,de-DE看起来很明显这是在德国说的德语。对于意大利语,it-IT看起来很明显这是在意大利说的意大利语。

pt-PT对于在葡萄牙说的葡萄牙语来说,同样的情况也很明显。不幸的是,事实并非如此。基于不确定的确切原因(可能是人口、原籍国、国家语言等),存在全球标准化,当您尝试从文化 id 创建特定文化时,根据该标准确定给定文化的默认区域设置(pt在这种情况下)。Microsoft 在以下链接中记录了整个列表:

http://msdn.microsoft.com/en-us/goglobal/bb896001.aspx

如果您想知道给定文化或语言的默认国家/地区区域设置,只需匹配上述链接中的最后一列(语言名称缩写)代码。

对于葡萄牙语,不变文化的语言名称缩写“葡萄牙语”与“葡萄牙语(巴西)”相匹配,即 PTB。葡萄牙语(葡萄牙)有不同的代码PTG。所以在这种情况下,葡萄牙语(巴西)是葡萄牙语的默认语言环境。

如果您的应用程序逻辑或要求以任何方式依赖此 API 的这种行为,您必须谨慎。这种行为在基于 Web 的应用程序中变得更加重要,因为市场上的所有浏览器也遵循这些准则,并在您查看多语言网站的本地化版本时在 http 请求标头中发送适当的信息。

我仍在寻找原因,尽管这是将特定国家/地区设置为任何文化的默认语言环境的因素,这在葡萄牙语的情况下听起来并不那么明显欢迎任何信息或评论。

于 2014-10-21T07:28:26.423 回答
2

工厂方法和构造函数之间还有一个明显的区别:构造函数提供了一个额外的可选布尔值,它的默认设置为 true。

如果您确实需要 >"plain"<cultureinfo,您将需要将此布尔值设置为 false,因为:如果您请求特定文化(例如de-DE)而没有“布尔设置为 false”,您将始终获得文化 -设置,可能有意外的设置,具体取决于用户如何通过控制面板更改此区域性。

工厂方法不支持这个布尔值!!!

关于何时希望此布尔值成为最后两个想法:

  • true:您正在为您的 UI 生成输出 - 此输出应根据用户通过控制面板选择的特定文化设置
  • false:您想要解析数据(例如来自 XML)并且您知道特定的 XML 文化设置(例如作为逗号的十进制分隔符)。在这种情况下,您将需要一种plain de-DE文化,以确保特殊的控制面板设置不会干扰。
于 2017-03-28T11:41:47.637 回答