2012-06-30 12 views
7

एक बहुत ही साधारण बात है, और मैं इसे काम नहीं कर सकता। मैं अपने डीएलएल को वैश्वीकृत करना चाहता हूं इस प्रकार मैं संसाधन फ़ाइलों + संसाधन प्रबंधक का उपयोग कर रहा हूं।संसाधन प्रबंधक एक ही संसाधन लौटा रहा है, हालांकि CultureInfo निर्दिष्ट है

मैं इस तरह संसाधनप्रबंधक फोन:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

इस

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

तरह तार जाओ और यह देता है 4 बार एक ही स्ट्रिंग। मेरी फाइलें

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

सभी फ़ाइल सेटिंग्स समान हैं, लेकिन जैसा कि बताया गया है - केवल डिफ़ॉल्ट फ़ाइल में संसाधन का उपयोग किया जाता है।

मैं यहां क्या देख रहा हूं?

+2

.resx फ़ाइल वास्तव में उपग्रह विधानसभाओं में संकलित हो रही हैं? बिन \ डीबग फ़ोल्डर में देखें और नाम एन, एनएल और एनएल-एनएल के साथ उपनिर्देशिकाओं को देखें। –

+0

अनुवाद 'Default.ResourceManager.GetString' के माध्यम से प्राप्त करने का प्रयास करें। संभवतः आपके द्वारा बनाए जा रहे संसाधन प्रबंधक को कुछ गलत पैरामीटर मिलते हैं। –

उत्तर

10

संसाधन फ़ाइलों का उपयोग करने के कुछ तरीके हैं, जिनमें से एक .resx फ़ाइलों का उपयोग कर रहा है। Thread.CurrentThread.CurrentUICulture के मान के आधार पर ये फ़ाइलें स्वचालित रूप से स्थानीयकृत हो जाती हैं। डिफ़ॉल्ट .resx फ़ाइल असेंबली में संकलित हो जाती है (उदाहरण के लिए आपका मुख्य निष्पादन योग्य), जबकि स्थानीय संसाधन (Default.nl-NL.resx) एक असेंबली में अपनी पहचान (संस्कृति पहचानकर्ता, nl-NL पर आधारित) में संकलित हो जाते हैं, <AssemblyName>.resources.dll कहा जाता है।

उन संसाधनों से मूल्यों को संबोधित करना <ResourceName>.<KeyName> के रूप में आसान है, उदाहरण के लिए Default.Greeting। यह परीक्षण करने के लिए, आप संस्कृति बदलने के लिए, का उपयोग करते हुए:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

कौन सा होगा उत्पादन

Hello 
Hallo 

कार्यक्रम स्टार्टअप पर, यूआई संस्कृति कंप्यूटर उस पर चल रहा है की संस्कृति के लिए, सेट कर दिया जाता है ताकि आप जीता स्थानीयकृत संसाधनों को हमेशा प्रस्तुत करने के लिए स्वयं को भाषा निर्दिष्ट नहीं करना है। तो, .resx फाइलें जाने का रास्ता प्रतीत होती हैं।

से ResourceManager का उपयोग करते समय, आपको .resources फ़ाइलों को पढ़ना होगा। यदि कोई नहीं है (आपके मामले में) Appname.Default.resources फ़ाइल,विफल हो जाएगा। तो मुझे लगता है कि आपने पहले एक .resources फ़ाइल बनाई है, लेकिन स्थानीय .resx फ़ाइलों को .resources फ़ाइलों में परिवर्तित नहीं किया है।

आप संसाधनप्रबंधक उपयोग करने के लिए संस्कृति निर्दिष्ट करने के लिए सक्षम होना चाहते हैं, तो आप उपयोग कर सकते हैं:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

धन्यवाद - मुझे नहीं पता कि मैंने संसाधनों का उपयोग क्यों नहीं किया। डीफॉल्ट। सप्ताहांत होना चाहिए! –

+0

@CodeCaster क्या आप कृपया मेरे प्रश्न पर एक नज़र डालें। http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc

संबंधित मुद्दे