C .resx फ़ाइल से C # में स्ट्रिंग पढ़ें


99

C .resx फ़ाइल से स्ट्रिंग को c # में कैसे पढ़ें? कृपया मुझे दिशानिर्देश भेजें। क्रमशः


इस लिंक पर एक नज़र है , यह मदद करनी चाहिए।
एड्रियन स्टेंडर

15
क्यों? अगर वे मुझे मेरे सवालों पर संतुष्ट नहीं करते हैं, तो मुझे गलत सुझावों को क्यों स्वीकार करना होगा?
लाल हंस

1
यदि .resx फ़ाइल को प्रोजेक्ट गुणों के तहत Visual Studio का उपयोग करके जोड़ा गया था, तो स्ट्रिंग तक पहुँचने के लिए आसान और कम त्रुटि वाले तरीके के लिए मेरा उत्तर देखें ।
जोशकोड्स

जवाबों:


75

यह उदाहरण रिसोर्स मैन पेज पर MSDN पेज से है। गेटस्ट्रिंग () :

// Create a resource manager to retrieve resources.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());

// Retrieve the value of the string resource named "welcome".
// The resource manager will retrieve the value of the  
// localized resource using the caller's current culture setting.
String str = rm.GetString("welcome");

4
MSDN पृष्ठ से मैंने संदर्भित किया: आधार नाम इसके विस्तार के बिना संसाधन फ़ाइल का मूल नाम है, लेकिन किसी भी पूरी तरह से योग्य नामस्थान नाम सहित। उदाहरण के लिए, MyApplication.MyResource.en-US.resource नाम की संसाधन फ़ाइल का मूल नाम MyApplication.MyResource है।
जेएफएच

1
आइटम == संसाधन फ़ाइल का नाम स्थान

7
खराब उदाहरण: आपको समझाया जाना चाहिए कि आइटम नामस्थान + संसाधन का मूल प्रकार है
ActiveX

आपको केवल ResourceManagerतब की आवश्यकता होती है जब आप एक बाहरी संसाधन को लोड करना चाहते हैं। <Namespace>.Propertiesइसके बजाय उपयोग करें ।
यौषा अलायबॉब

131

ResourceManagerजब तक आप बाहरी संसाधन से लोड नहीं कर रहे हैं, तब तक इसकी आवश्यकता नहीं होनी चाहिए ।
अधिकांश बातों के लिए, मान लें कि आपने एक प्रोजेक्ट (DLL, WinForms, जो कुछ भी बनाया है) आप केवल प्रोजेक्ट नेमस्पेस, "संसाधन" और संसाधन पहचानकर्ता का उपयोग करते हैं। उदाहरण के लिए:

एक परियोजना के नाम मान लेना: UberSoft.WidgetPro

और आपके resx में शामिल हैं:

रेक्स सामग्री उदाहरण

आप बस उपयोग कर सकते हैं:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

4
इस उत्तर के लिए एक टन धन्यवाद।
वैशाली

1
धन्यवाद, इसे एक उत्तर के रूप में चिह्नित किया जाना चाहिए। इस प्रश्न के "उत्तर" की तुलना में बहुत स्पष्ट और स्वच्छ।
जीरो जोंकमैन

प्रकार या नाम स्थान मौजूद नहीं है
पॉल मैकार्थी

53

यह कोशिश करो, मेरे लिए काम करता है .. सरल

मान लें कि आपके संसाधन फ़ाइल का नाम "TestResource.resx" है, और आप कुंजी को तब गतिशील रूप से पास करना चाहते हैं,

string resVal = TestResource.ResourceManager.GetString(dynamicKeyVal);

नाम स्थान जोड़ें

using System.Resources;

यदि आप संस्कृति-विशिष्ट आउटपुट को सुनिश्चित करना चाहते हैं, तो आप वैकल्पिक रूप से संस्कृति को निर्दिष्ट कर सकते हैं - जो डिफ़ॉल्ट के विपरीत है। उदाहरण के लिए TestResource.ResourceManager.GetString (विवरण, नई CultureInfo ("एन-जीबी"));
इयान

मुझे निम्न त्रुटि मिलती है: 'संसाधन' में 'गेटस्ट्रिंग' की परिभाषा नहीं है।
लेउचिको

आपको केवल ResourceManagerतब की आवश्यकता होती है जब आप एक बाहरी संसाधन को लोड करना चाहते हैं। <Namespace>.Propertiesइसके बजाय उपयोग करें ।
योषा अलाय्यूब

29

.Resx फ़ाइल खोलें और सार्वजनिक रूप से "एक्सेस संशोधक" सेट करें।

var <Variable Name> = Properties.Resources.<Resource Name>

2
क्या यह विधि एकाधिक संसाधन फ़ाइल (भाषाओं) के साथ काम करती है, हर कारण जहां मैं देखती हूं कि वे संसाधन
प्रबंधक

1
काम नहीं करता। गुण के बाद मेरा संसाधन फ़ाइल नहीं दिखाया गया है। स्रोत। "मेरा फ़ाइल नाम" भले ही सार्वजनिक रूप से सेट किया गया हो
user1804084

27

.Resx फ़ाइल को प्रोजेक्ट गुणों के तहत Visual Studio का उपयोग करके जोड़ा गया था, स्ट्रिंग को एक्सेस करने का एक आसान और कम त्रुटि वाला तरीका है।

  1. समाधान एक्सप्लोरर में .resx फ़ाइल का विस्तार एक .Designer.cs फ़ाइल दिखाना चाहिए।
  2. जब खोला जाता है, .Designer.cs फ़ाइल में एक गुण नाम और आंतरिक वर्ग होता है। इस उदाहरण के लिए मान लीजिए कि वर्ग का नाम संसाधन है।
  3. स्ट्रिंग तक पहुँचना उतना ही आसान है:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. JoshCodes.Core.Testing.Unitप्रोजेक्ट के डिफ़ॉल्ट नामस्थान के साथ बदलें ।

  5. अपने स्ट्रिंग संसाधन के नाम के साथ "exampleXml" बदलें।

3
बहुत मददगार। धन्यवाद।
19

16

@JeffH जवाब के बाद, मैं typeof()स्ट्रिंग विधानसभा नाम की तुलना में उपयोग करने की सलाह देता हूं ।

    var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
    string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));

10

यदि किसी कारण से आप अपनी संसाधन फ़ाइलों को App_GlobalResources में नहीं डाल सकते हैं, तो आप ResXResourceReader या XML रीडर का उपयोग करके सीधे संसाधन फ़ाइलें खोल सकते हैं।

यहाँ ResXResourceReader का उपयोग करने के लिए नमूना कोड है:

   public static string GetResourceString(string ResourceName, string strKey)
   {


       //Figure out the path to where your resource files are located.
       //In this example, I'm figuring out the path to where a SharePoint feature directory is relative to a custom SharePoint layouts subdirectory.  

       string currentDirectory = Path.GetDirectoryName(HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"]));

       string featureDirectory = Path.GetFullPath(currentDirectory + "\\..\\..\\..\\FEATURES\\FEATURENAME\\Resources");

       //Look for files containing the name
       List<string> resourceFileNameList = new List<string>();

       DirectoryInfo resourceDir = new DirectoryInfo(featureDirectory);

       var resourceFiles = resourceDir.GetFiles();

       foreach (FileInfo fi in resourceFiles)
       {
           if (fi.Name.Length > ResourceName.Length+1 && fi.Name.ToLower().Substring(0,ResourceName.Length + 1) == ResourceName.ToLower()+".")
           {
               resourceFileNameList.Add(fi.Name);

           }
        }

       if (resourceFileNameList.Count <= 0)
       { return ""; }


       //Get the current culture
       string strCulture = CultureInfo.CurrentCulture.Name;

       string[] cultureStrings = strCulture.Split('-');

       string strLanguageString = cultureStrings[0];


       string strResourceFileName="";
       string strDefaultFileName = resourceFileNameList[0];
       foreach (string resFileName in resourceFileNameList)
       {
           if (resFileName.ToLower() == ResourceName.ToLower() + ".resx")
           {
               strDefaultFileName = resFileName;
           }

           if (resFileName.ToLower() == ResourceName.ToLower() + "."+strCulture.ToLower() + ".resx")
           {
               strResourceFileName = resFileName;
               break;
           }
           else if (resFileName.ToLower() == ResourceName.ToLower() + "." + strLanguageString.ToLower() + ".resx")
           {
               strResourceFileName = resFileName;
               break;
           }
       }

       if (strResourceFileName == "")
       {
           strResourceFileName = strDefaultFileName;
       }



       //Use resx resource reader to read the file in.
       //https://msdn.microsoft.com/en-us/library/system.resources.resxresourcereader.aspx

       ResXResourceReader rsxr = new ResXResourceReader(featureDirectory + "\\"+ strResourceFileName);         

       //IDictionaryEnumerator idenumerator = rsxr.GetEnumerator();
       foreach (DictionaryEntry d in rsxr)
       {
           if (d.Key.ToString().ToLower() == strKey.ToLower())
           {
               return d.Value.ToString();
           }
       }


       return "";
   }

धन्यवाद, ध्यान दें कि आपको System.Windows.Formsउपयोग करने के लिए एक संदर्भ जोड़ना होगा System.Resources.ResXResourceReader। इसके अलावा, आप इसके var enumerator = rsxr.OfType<DictionaryEntry>();बजाय LINQ का उपयोग और उपयोग कर सकते हैं ।
डनक

रेक्स फ़ाइल को "पढ़ना, पार्स और लोड करना" कैसे करना है, इसके बारे में लेख या पोस्ट खोजना बहुत कठिन है। आपको केवल "प्रोजेक्ट के तार के लिए कंटेनर के रूप में रेक्स का उपयोग करें" मिलता है। इस उत्तर के लिए धन्यवाद!
सिमोन

9

एक बार जब आप समाधान / असेंबली के लिए एक संसाधन (नाम: ResourceName और Value: ResourceValue) जोड़ लेते हैं, तो आप आवश्यक संसाधन प्राप्त करने के लिए बस "Properties.Resource.ResourceName" का उपयोग कर सकते हैं।


7

मैंने Visual Studio के माध्यम से .resx फ़ाइल जोड़ी। इसने designer.csमेरे द्वारा वांछित किसी भी कुंजी के मूल्य को तुरंत वापस करने के लिए गुणों के साथ एक फ़ाइल बनाई । उदाहरण के लिए, यह डिजाइनर फ़ाइल से कुछ ऑटो-जेनरेट किया गया कोड है।

/// <summary>
///   Looks up a localized string similar to When creating a Commissioning change request, you must select valid Assignees, a Type, a Component, and at least one (1) affected unit..
/// </summary>
public static string MyErrorMessage {
    get {
        return ResourceManager.GetString("MyErrorMessage", resourceCulture);
    }
}

इस तरह, मैं बस करने में सक्षम था:

string message = Errors.MyErrorMessage;

विजुअल स्टूडियो के माध्यम से बनाई गई फ़ाइल कहां Errorsहै Errors.resxऔर MyErrorMessageयह कुंजी है।


हाँ, मैंने अभी यह किया है VS2015 आज। राइट क्लिक करें, "संसाधन" फ़ाइल जोड़ें, और कोई भी कुंजी "dottable" हो जाती है। तो एक कुंजी "स्क्रिप्ट" के साथ "MyResx.resx" स्ट्रिंग स्क्रिप्ट की तरह पहुँचा जा सकता हैValue = MyResx.Script;
एमरिल

5

मैंने अपनी संसाधन फ़ाइल को सीधे अपनी परियोजना में जोड़ा, और इसलिए मैं रेक्स फ़ाइल नाम के साथ ठीक अंदर स्ट्रिंग को एक्सेस करने में सक्षम था।

उदाहरण: Resource1.resx में, कुंजी "resourceKey" -> string "dataString"। स्ट्रिंग "dataString" प्राप्त करने के लिए, मैंने सिर्फ Resource1.resourceKey रखा।

ऐसा नहीं करने के कारण हो सकते हैं जिनके बारे में मुझे जानकारी नहीं है, लेकिन यह मेरे लिए काम करता है।


3

ऐसा करने का सबसे आसान तरीका है:

  1. एक App_GlobalResources सिस्टम फ़ोल्डर बनाएँ और इसमें एक संसाधन फ़ाइल जोड़ें जैसे कि Message.resx
  2. संसाधन फ़ाइल में अपनी प्रविष्टियाँ बनाएँ। ErrorMsg = यह एक त्रुटि है।
  3. फिर उस प्रविष्टि का उपयोग करने के लिए: स्ट्रिंग ग़लती से = संसाधन

2

संसाधन फ़ाइल से मान प्राप्त करने का सबसे सरल तरीका। प्रोजेक्ट में संसाधन फ़ाइल जोड़ें। अब उस स्ट्रिंग को प्राप्त करें जहां आप जोड़ना चाहते हैं जैसे मेरे मामले में यह टेक्स्ट ब्लॉक (सिल्वरलाइट) था। कोई नामस्थान भी जोड़ने की जरूरत नहीं है। मेरे मामले में ठीक काम कर रहा है

txtStatus.Text = Constants.RefractionUpdateMessage;

निरंतर परियोजना में मेरा संसाधन फ़ाइल नाम है।यहाँ मेरी संसाधन फ़ाइल कैसी दिखती है


0

संसाधनों को पुनः प्राप्त करने के लिए एक संसाधन प्रबंधक बनाएँ।

ResourceManager rm = new ResourceManager("param1",Assembly.GetExecutingAssembly());

String str = rm.GetString("param2");

param1 = "असेम्बलीनाम। RourceFolderName.ResourceFileName"

param2 = स्ट्रिंग का नाम जिसे संसाधन फ़ाइल से पुनर्प्राप्त किया जाना है


0

यह मेरे लिए काम करता है। आप स्ट्रिंग में ठीक के साथ एक strings.resx फ़ाइल है। इसे पढ़ने के लिए

String varOk = My.Resources.strings.ok
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.