文化信息名称属性

3

MSDN中读取

CultureInfo.Name 属性
获取以语言代码2-国家/地区代码2格式表示的区域设置名称。

以下是示例:

 Console.Write("{0,-7}", ci.Name);
 [...]

/*
This code produces the following output.  This output has been cropped for brevity.

CULTURE ISO ISO WIN DISPLAYNAME                              ENGLISHNAME
ar      [...]
bg      [...]
ca      [...]
zh-Hans [...]                    
cs      [...]
da      da  [...]
de      de  [...]
el      el  [...]
en      en  eng ENU English                                  English                                 
es      es  spa ESP Spanish                                  Spanish                                 
fi      fi  [...]
zh      zh  [...]
zh-Hant zh  [...]                   
zh-CHS  zh  [...] 
zh-CHT  zh  [...] 

*/

能有人解释一下 两个 字母的 languagecode2-country/regioncode2 格式是什么,以及如何从 CultureInfo 获取 "en-US" 字符串吗?

假设我有以下代码:

var culture = Context.Features.Get<IRequestCultureFeature>().RequestCulture.UICulture;
string lang2 = culture.TwoLetterISOLanguageName.ToLower();
string lang4 = culture.Name.ToLower();

最终lang2 == lang4,有没有办法获得“正确”的lang4

此外,CultureInfo不会检查无效的语言环境名称,任何两个字母的组合都可以使用(这里是示例):

using System;
using System.Globalization;

public class Program {
    public static void Main() {

        Console.Write(new CultureInfo("xx").Name);  // "xx" 
        Console.Write(new CultureInfo("xx-YY").Name);   // "xx-YY"  
    }
}

2
new CultureInfo("en-US").Name 应该可以解决问题。如果返回 'en',那么它是一般的英语文化,而不是特定的美国文化。 - Caramiriel
请查看更新后的原始帖子,我更好地解释了问题。 - serge
我真的不明白为什么你建议我获取“en-US”,如果你认为我已经有了这个字符串... - serge
https://referencesource.microsoft.com/#mscorlib/system/globalization/cultureinfo.cs,a99dfd86b8014a4a - Dmitry Bychenko
“正确的” lang4 是什么意思?您是在问为什么 culture.TwoLetterISOLanguageName.ToLower() 和 culture.Name.ToLower() 不同吗? - luxun
显示剩余4条评论
1个回答

4

MSDN提供的示例仅返回languagecode2,因为它迭代了CultureInfo.GetCultures(CultureTypes.NeutralCultures)。如其名称所示,被迭代的CultureInfo中性的,因此它们的名称仅由两个小写字母的语言代码组成。

更一般地说,CultureInfo提供有关特定文化的信息,当它不是中性文化时。

如果您的代码返回en,那么这只是表示中性文化被传递给了它。如果/当您将特定文化(例如:en-US)传递给它时,名称将相应匹配。


可以从CultureInfoMSDN页面的备注部分中获取更多信息:

中性文化由仅包含两个小写字母的语言代码指定。例如,fr指定法语的中性文化,de指定德语的中性文化。


谢谢。微软文档页面没有提到那个信息。我的意思是,“..culture is specified by”并不明确地说明“Name”属性。 - serge
是的,文档对此有些不清楚,特别是如果您查看“Name”属性文档。尽管如此,“CultureInfo”类的主要文档似乎更完整,也更值得信赖。 - yorah
1
我刚刚在“名称”文档页面上发送了反馈,要求它对于中性文化更加清晰明了。 - yorah
我更新了OP并添加了一些细节...似乎CultureInfo在创建类时不会检查有效的文化...例如new CultureInfo("xx-YY") - serge
1
实际上比这更复杂。当你创建一个 CultureInfo 时,它会委派给你的底层操作系统。在 Windows 10 之前,尝试创建一个无效的文化会抛出一个 CultureNotFoundException。自从 Windows 10 以后,似乎操作系统表示任何文化都是正确的(如果它实际上并不存在,则会有InvariantCulture的数据)。关于此问题的更多信息可以参见:https://github.com/dotnet/corefx/issues/1669。 - yorah
显示剩余3条评论

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