2009-12-01 15 views
16

मेरे पास विभिन्न भाषाओं में अनुवादित ग्रंथों के साथ संसाधन असेंबली है। परियोजना तरह का इस तरह दिखता है:सी #: किसी निश्चित संस्कृति से संसाधन स्ट्रिंग कैसे प्राप्त करें

  • FooBar.resx
  • FooBar.nb-NO.resx
  • FooBar.sv-SE.resx
  • ...

मैं कर सकते हैं इस तरह के स्थिर गुणों का उपयोग कर ग्रंथ प्राप्त करें:

var value = FooBar.Hello; 

या थाई जैसे प्रतिबिंब का उपयोग करके एस:

var value = resourceAssembly 
     .GetType("Namespace.FooBar") 
     .GetProperty("Hello") 
     .GetValue(null, null) as string; 

दोनों तरीकों से मुझे वर्तमान धागे की वर्तमान यूआई संस्कृति से संबंधित मूल्य मिलेगा। जो ठीक है और पूरी तरह से मैं क्या पसंद करूंगा।

लेकिन, क्या मैं कुछ ऐसा कर सकता हूं यदि मैं स्पष्ट रूप से स्वीडिश मूल्य उदाहरण के लिए यूआई संस्कृति को बदलने के बिना चाहता हूं?

उत्तर

18

आप विजुअल स्टूडियो जेनरेट करते हुए FooBar क्लास की Culture संपत्ति मैन्युअल रूप से बदल सकते हैं। या यदि आप सीधे ResourceManager class का उपयोग कर रहे हैं, तो आप GetString के अधिभार का उपयोग कर सकते हैं जो वांछित संस्कृति को पैरामीटर के रूप में लेता है।

+0

ResourceManagers बनाया जा सकता है और दूर आसानी से फेंक दिया, या वे साफ की आवश्यकता होती है और ऐसा/या वे केवल एक बार बनाया है और अधिक के लिए इस्तेमाल किया जाना चाहिए? – Svish

+0

संसाधन प्रबंधक का उपयोग कर समाप्त हुआ :) – Svish

+0

धन्यवाद ......! –

0

आप अपने संसाधन पहुंच वर्ग में संस्कृति को मैन्युअल रूप से बदल सकते हैं। लेकिन यह कुछ हद तक अनुशंसित है क्योंकि इससे कई अन्य अंतर्राष्ट्रीयकरण समस्याएं होती हैं।

उदा। आप करने के लिए होगा:

  • हैंडल सभी नंबर स्वरूपण संस्कृति के साथ overloads
  • सुनिश्चित करें कि अन्य पुस्तकालयों आप एक ऐसी ही तंत्र आप
  • मामलों में जहां ऊपर असंभव है में है कि राशि का उपयोग (जैसे बीसीएल) सब कुछ के लिए रैपर बनाएं जो संस्कृति विशिष्ट हो सकता है (और यह सामानों का एक बहुत है)।

तो यदि संभव हो तो वर्तमान धागे की वर्तमान यूआई संस्कृति को बदल दें।

0

यहां कुछ कोड है जिसका उपयोग मैंने संस्कृति नाम से संसाधन फ़ाइल को पकड़ने के लिए किया है - यह vb.net है, लेकिन आपको यह विचार मिलता है।

Dim reader As New System.Resources.ResXResourceReader(String.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture)) 

और यदि आप एक शब्दकोश के रूप में यह वापस करना चाहते:

If reader IsNot Nothing Then 
    Dim d As New Dictionary(Of String, String) 
    Dim enumerator As System.Collections.IDictionaryEnumerator = reader.GetEnumerator() 
    While enumerator.MoveNext 
     d.Add(enumerator.Key, enumerator.Value) 
    End While 
    Return d 
End If 
0

getValue के दूसरे अधिभार का उपयोग करें: -

.GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE")) 
+0

एचएम ...मैंने कोशिश की, लेकिन यह सिर्फ वही मूल्य वापस करने लग रहा था। फिर से प्रयास करना होगा ... – Svish

+0

मुझे लगता है कि यह इस बात पर निर्भर करेगा कि संपत्ति कैसे कार्यान्वित की जाती है, आप वास्तव में संपत्ति कार्यान्वयन नहीं दिखाते हैं। – AnthonyWJones

+0

ऐसा इसलिए है क्योंकि मैंने इसे लागू नहीं किया है। यह सिर्फ डिफ़ॉल्ट दृश्य स्टूडियो जेनरेट की गई सामग्री है। – Svish

12

निम्नलिखित कोड का प्रयास करें। यह मेरे लिए ठीक है कम से कम काम किया:

FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE")) 
संबंधित मुद्दे