2012-01-19 26 views
13

किसी विशिष्ट देश कोड को देखते हुए, उदा। "सीएच", मैं एक CultureInfo ऑब्जेक्ट कैसे प्राप्त कर सकता हूं? विशिष्ट देश कोड गतिशील है (रनटाइम पर परिवर्तन)। मेरे पास केवल देश कोड है, और मैं जानना चाहता हूं कि से देश संस्कृति कोड से संस्कृतिइन्फो ऑब्जेक्ट बनाना संभव है या नहीं। इससे कोई फर्क नहीं पड़ता कि मुझे कौन सी सटीक संस्कृति मिलती है (एफआर-सीएच/डी-सीएच)।देश के नाम से RegionInfo ऑब्जेक्ट प्राप्त करें या RegionInfo ऑब्जेक्ट

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

*** यूएस *** के लिए आपको 'chr-US en-US es-US और haw-US' मिलता है: _Cheroqui, अंग्रेज़ी, स्पेनिश, Hawai_ – Kiquenet

उत्तर

21

आप केवल देश कोड है, तो आप कुछ इस तरह इस्तेमाल कर सकते हैं कि देश के साथ जुड़े सभी संस्कृति infos मिल रहे हैं:

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

संपादित करें: CH से पहले - जोड़ने बढ़त मामले को रोकने के लिए, के रूप में बताया @JeppeStigNielsen द्वारा (नीचे टिप्पणियां देखें)।

+0

उपयोगी ** 'iso2 =" यूएस ";' ** कोड: 'var cultureInfo = CultureInfo.GetCultures (CultureTypes.AllCultures)। जहां (c => c.Name.EndsWith (iso2))। ToList(); foreach (System.Globalization।cultureList में CultureInfo संस्कृति) { Response.Write (+ ISO2 + "
के लिए संस्कृति" ":" + culture.DisplayName + "***" + culture.NativeName + "" + culture.TwoLetterISOLanguageName + "-" + संस्कृति। थ्रीलेटर इलुंगेजनाम + "-" + संस्कृति। डेटटाइमफॉर्मैट। फुलडेट टाइमटाइटर); } ' – Kiquenet

+1

यह प्रश्न दयालु उत्तर देने योग्य है (और मैंने अभी एक और पोस्ट किया है), लेकिन फिर भी: जब मैं __Haiti__, देश कोड' HT "के साथ अपना कोड आज़माता हूं, तो मुझे वापस आने वाली संस्कृतियों में से एक' "zh-CHT" ', __Chinese (पारंपरिक) Legacy__, जिसे __ 中文 (繁體) 舊版 __ के रूप में जाना जाता है। –

+0

@JeppeStigNielsen उपरोक्त कोड को 'एंड्स विथ ("- सीएच") में बदलना' चाल है या आप किसी अन्य किनारे के मामले के बारे में सोच सकते हैं? –

4

क्या आप एक संस्कृतिइंफो ऑब्जेक्ट बनाने की कोशिश कर रहे हैं? इस तरह:

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' प्राप्त कर सकता हूं? – 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") पर इस्तेमाल किया, यह देता है, .नेट फ्रेमवर्क के अपने संस्करण पर और मेरे 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) मिलते हैं।