Получить объект CultureInfo из названия страны или объекта RegionInfo - PullRequest
15 голосов
/ 19 января 2012

Учитывая конкретный код страны, например, "CH", как я могу получить объект CultureInfo?Код конкретной страны является динамическим (изменяется во время выполнения).У меня есть только код страны, и я хочу знать, возможно ли создать объект CultureInfo из просто кода страны.Неважно, какую именно культуру я получу (fr-CH / de-CH).

Я пытаюсь сделать что-то вроде этого:

CultureInfo c = CultureInfo.CreateSpecificCulture("CH");

Можно ли создатькультура из объекта RegionInfo?Тогда это будет выглядеть так:

RegionInfo r= new RegionInfo("CH");
CultureInfo c = CultureInfo.CreateSpecificCulture(r);

Очевидно, что предыдущие примеры не компилируются, они просто дают представление о том, чего я пытаюсь достичь.

Ответы [ 3 ]

25 голосов
/ 19 января 2012

Если у вас есть только код страны, вы можете использовать что-то вроде этого для получения всей информации о культуре, связанной с этой страной:

var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
                              .Where(c => c.Name.EndsWith("-CH"));

РЕДАКТИРОВАТЬ: добавление - перед CH для предотвращения крайнего случая, как указано @JeppeStigNielsen (см. Комментарии ниже).

4 голосов
/ 19 января 2012

Вы пытаетесь создать объект 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 голосов
/ 01 февраля 2017

Конечно, это уродливо, потому что в стране (включая ваш пример "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).

...