2012-01-19 2 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 Method] (http://msdn.microsoft.com/en-us/library/yck8b540.aspx)를 찾으십니까? –

+0

*** 미국 ***에 대해서는'chr-US en-US es-US and haw-US'을 얻습니다 : _Cheroqui, English, Spanish, Hawai_ – Kiquenet

답변

21

, 해당 국가와 관련된 모든 문화 정보를 정기적으로 얻을 같은 것을 사용할 수 있습니다

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

편집 : 지적, 가장자리 사건을 방지하기 위해 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", __ 중국어 (번체) 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 ** - *** Nation *** 값을 사용하여'CultureInfo'를 얻을 수 있습니까? – Kiquenet

2

물론 국가 (귀하의 경우 "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)을 얻습니다.

관련 문제