2012-01-19 9 views
13

特定の国コードが指定されています。 "CH"、どうやってCultureInfoオブジェクトを取得できますか?特定の国コードは動的です(実行時の変更)。 私は国番号しか持っていないので、CultureInfoオブジェクトを作成できるかどうかをから国コードまで知りたいと思っています。私が得た正確な文化(fr-CH/de-CH)は重要ではありません。国名またはRegionInfoオブジェクトからCultureInfoオブジェクトを取得します。

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

はRegionInfoオブジェクトから文化を創造することが可能であろう:

私はこのような何かをしようとしていますか? はその後、それは次のようになります。

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

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

+1

カナダやベルギーではどのような文化がありますか? –

+1

[CultureInfo.GetCultureInfoメソッド](http://msdn.microsoft.com/en-us/library/yck8b540.aspx)をお探しですか? –

+0

*** US ***の場合は、 'chr-US en-US es-USとhaw-US'を取得します:_Cheroqui、English、Spanish、Hawai_ – Kiquenet

答えて

21

、あなたはその国に関連付けられているすべての文化に関する情報を取得するには、このようなものを使用することができます

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

EDIT:指摘したように、エッジケースを防ぐためにCH-を追加@JeppeStigNielsen(下記のコメントを参照)。

+0

便利** ** iso2 = "US"; **コード: 'var cultureInfo = CultureInfo.GetCultures(CultureTypes.AllCultures).Where(c => c.Name.EndsWith(iso2))。ToList(); foreach(System.Globalization。cultureListでCultureInfoカルチャ)+ ISO2 + {のResponse.Write( "の
文化 " ":" + culture.DisplayName +" *** "+ culture.NativeName +" "+ culture.TwoLetterISOLanguageName +" - " + culture.ThreeLetterISOLanguageName + " - " + culture.DateTimeFormat.FullDateTimePattern); } ' – Kiquenet

+1

この質問は、醜い答えに値する(と私はちょうど別のものを投稿した)が、まだ:あなたが__Haiti__、国コード' 'HT" 'でコードを試してみると、 "zh-CHT"、__Chinese(Traditional)Legacy__、ネイティブに__中文(繁體)旧版__として知られています。 –

+0

@JeppeStigNielsen上記のコードを 'EndsWith(" - CH ")'に変更すると、トリックになるか、別のエッジケースを考えることができますか? –

4

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/それは、すべての文化を示しています。あなたが唯一の国コードをお持ちの場合

+0

私は国コードしか持っていません。国コードだけからCultureInfoオブジェクトを作成することができます。しかし、それは動的でなければなりません。 – Ben

+0

** HKCU \ Control Panel \ International \ Geo **を使用して 'CultureInfo'を取得できますか?*** Nation *** value? – Kiquenet

2

もちろん、国(あなたの例を含めて"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")で使用される、それは、.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)が得られます。

関連する問題