web-dev-qa-db-ja.com

国名またはRegionInfoオブジェクトからCultureInfoオブジェクトを取得します

特定の国コードが与えられた場合、例: 「CH」、CultureInfoオブジェクトを取得するにはどうすればよいですか?特定の国コードは動的です(実行時に変更されます)。私は国コードしか持っていませんが、just国コードからCultureInfoオブジェクトを作成できるかどうか知りたいです。どの正確な文化(fr-CH/de-CH)を取得するかは関係ありません。

私はこのようなことをしようとしています:

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

RegionInfoオブジェクトからカルチャを作成することは可能でしょうか?次に、次のようになります。

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

明らかに、前述の例はコンパイルされません。それらは、私が達成しようとしていることのアイデアを与えるだけです。

15
Ben

国コードしかない場合は、次のようなものを使用して、その国に関連付けられているすべての文化情報を取得できます。

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

編集:@JeppeStigNielsenが指摘しているように、エッジケースを防ぐためにCHの前に-を追加します(以下のコメントを参照)。

25

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/ それはすべての文化を示しています。

4
Fabio Luz

もちろん、これは醜いことです。国(例の_"CH"_スイスを含む)には多くの言語がある可能性があるからです。

それでも、私はあなたに2つの醜い方法を提供します。最初の1つ:

_static IEnumerable<CultureInfo> FindCandidateCultures(RegionInfo region)
{
  return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
    .Where(x => (new RegionInfo(x.Name)).GeoId == region.GeoId);
}
_

特定の例new RegionInfo("CH")で使用すると、私のバージョンの.NETFrameworkと私のWindowsバージョンで次のようになります。

de-CH:ドイツ語(スイス)
 fr-CH:フランス語(スイス)
 gsw-CH:アルザス語(スイス)
 it-CH:イタリア語(スイス)
 rm-CH:ロマンシュ語(スイス)
 wae-CH:ウォルザー(スイス)

私があなたに提供する2番目の方法:

_// 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)を取得します。

3