Получить объект CultureInfo из имени страны или объекта RegionInfo
Учитывая конкретный код страны, например. "CH", как я могу получить объект CultureInfo? Конкретный код страны является динамическим (изменяется во время выполнения).
У меня есть код страны, и я хочу знать, можно ли создать объект CultureInfo из только кода страны. Неважно, какую именно культуру я получаю (fr-CH/de-CH).
Я пытаюсь сделать что-то вроде этого:
CultureInfo c = CultureInfo.CreateSpecificCulture("CH");
Можно ли создать культуру из объекта RegionInfo?
Тогда это будет выглядеть так:
RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);
Очевидно, что предыдущие примеры не компилируются, они просто дают представление о том, чего я пытаюсь достичь.
Ответы
Ответ 1
Если у вас есть только код страны, вы можете использовать что-то вроде этого, чтобы получить всю информацию о культуре, связанную с этой страной:
var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
.Where(c => c.Name.EndsWith("-CH"));
EDIT: добавление -
до CH
для предотвращения случая с краем, как указано @JeppeStigNielsen (см. комментарии ниже).
Ответ 2
Вы пытаетесь создать объект CultureInfo? например:
CultureInfo c = new CultureInfo("de-CH"); //culture for German (Switzerland)
CultureInfo c = new CultureInfo("fr-CH"); //culure for French (Switzerland)
CultureInfo c = new CultureInfo("it-CH"); //culture for Italian (Switzerland)
Возможно, эта ссылка может быть полезна http://www.csharp-examples.net/culture-names/ показывает все культуры.
Ответ 3
Конечно, это уродство, потому что страна (включая ваш пример "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)
.