我需要一种检测Thread.CurrentThread.CurrentCulture
是否使用特定语言的方法。
特别是,我需要检测CurrentCulture
CultureInfo
对象是否支持/使用/是否为“英语”,而与国家/地区无关,但是,我也可能想检查其他语言。
我知道任何英语CultureInfo
对象的Name
都会以en-
为前缀,然后是区域(US
,GB
等)-根据MSDN's Table of Language Culture Name and Codes。
因此,我可以简单地检查当前区域性名称是否以“ en-
”前缀“开头”:
var currentCultureName = Thread.CurrentThread.CurrentCulture.Name;
if (currentCultureName.StartsWith("en-"))
{
// We have an English language culture
}
编辑:同样(如Evk指出)-如果我要使用
TwoLetterISOLanguageName
,我可能会得到相同的结果:var twoLetterISOLanguageName =
Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
if (twoLetterISOLanguageName.Equals("en", StringComparison.InvariantCultureIgnoreCase))
{
// We have an English language culture
}
是否存在一种替代的或更安全的类型检查方式,并且可能需要检测其他语言(例如法语,德语等)? -为了省去编写可能很大的
switch
语句?或者,我在上面使用的是-并使用
switch
语句是最佳方法吗?在此先感谢您的帮助和建议:)
最佳答案
确实没有一个非常优雅的解决方案,您提出的建议对几种语言来说还不错。您可以使用CultureInfo.Parent Property来返回中性文化。
当存在可以使用多种父语言的层次结构(例如:某些繁体中文,台湾)时,会带来一些麻烦。但这对于DE,FR和EN来说应该没问题。
var neutralCulture = Thread.CurrentThread.CurrentCulture.Parent.Name;
if (neutralCulture.Equals("en", StringComparison.OrdinalIgnoreCase))
{
// We have an English language culture
}
else if (neutralCulture.Equals("fr", StringComparison.OrdinalIgnoreCase))
{
// We have a French language culture
}
else if (neutralCulture.Equals("de", StringComparison.OrdinalIgnoreCase))
{
// We have a German language culture
}