Конечно, это уродливо, потому что в стране (включая ваш пример "CH"
Швейцария) может быть много языков.
Тем не менее, я предложу вам два уродливых метода. Первый:
static IEnumerable<CultureInfo> FindCandidateCultures(RegionInfo region)
{
return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Where(x => (new RegionInfo(x.Name)).GeoId == region.GeoId);
}
При использовании в вашем конкретном примере new RegionInfo("CH")
для моей версии .NET Framework и моей версии для Windows:
de-CH: German (Switzerland)
fr-CH: French (Switzerland)
gsw-CH: Alsatian (Switzerland)
it-CH: Italian (Switzerland)
rm-CH: Romansh (Switzerland)
wae-CH: Walser (Switzerland)
Второй метод, который я вам предложу:
// ugly reflection, this can break any day!
static CultureInfo ConvertToCulture(RegionInfo region)
{
var data = typeof(RegionInfo).GetField("m_cultureData", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(region);
var name = (string)(data.GetType().GetProperty("SNAME", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(data));
return CultureInfo.GetCultureInfo(name);
}
Как очевидно, он использует внутренние представления mscorlib.dll
, и мы никогда не знаем, порвет ли он с будущими версиями. Но это дает вам возможность выбрать конкретную культуру. На моей машине с new RegionInfo("CH")
вы получаете it-CH: Italian (Switzerland)
.