legge la stringa dal file .resx in C #


99

Come leggere la stringa dal file .resx in c #? per favore inviami le linee guida. passo dopo passo


Dai un'occhiata a questo link, dovrebbe aiutare.
Adriaan Stander

15
perché? se non mi hanno soddisfatto delle mie domande, allora perché devo accettare suggerimenti sbagliati?
Red Swan

1
Se il file .resx è stato aggiunto utilizzando Visual Studio nelle proprietà del progetto, vedere la mia risposta per un modo più semplice e meno soggetto a errori per accedere alla stringa.
Joshcodes

Risposte:


75

Questo esempio è tratto dalla pagina MSDN su ResourceManager.GetString () :

// 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
Dalla pagina MSDN ho fatto riferimento a: baseName Il nome radice del file di risorse senza la sua estensione ma includendo qualsiasi nome completo dello spazio dei nomi. Ad esempio, il nome radice per il file di risorse denominato MyApplication.MyResource.en-US.resources è MyApplication.MyResource.
JeffH

1
elementi == spazio dei nomi del file di risorse

7
esempio scarso: dovresti spiegare che gli elementi sono il tipo di spazio dei nomi + radice della risorsa
ActiveX

È necessario solo ResourceManagerquando si desidera caricare una risorsa esterna. Usa <Namespace>.Propertiesinvece.
Yousha Aleayoub

131

ResourceManagernon dovrebbe essere necessario a meno che non si stia caricando da una risorsa esterna .
Per la maggior parte delle cose, supponi di aver creato un progetto (DLL, WinForms, qualunque cosa) usi solo lo spazio dei nomi del progetto, "Risorse" e l'identificatore di risorsa. per esempio:

Supponendo uno spazio dei nomi del progetto: UberSoft.WidgetPro

E il tuo resx contiene:

esempio di contenuto resx

Puoi semplicemente usare:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

4
Grazie mille per questa risposta.
Vaishali

1
Grazie, questo dovrebbe essere contrassegnato come risposta. Molto più chiara e pulita della "risposta" a questa domanda.
Jeroen Jonkman,

Il tipo o lo spazio dei nomi non esiste
Paul McCarthy il

53

Prova questo, funziona per me .. semplice

Supponi che il nome del tuo file di risorse sia "TestResource.resx" e quindi desideri passare la chiave dinamicamente,

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

Aggiungi spazio dei nomi

using System.Resources;

Facoltativamente, è anche possibile specificare la cultura, utile se si desidera garantire un output specifico delle impostazioni cultura che contraddice l'impostazione predefinita. es. TestResource.ResourceManager.GetString (descrizione, new CultureInfo ("en-GB"));
Ian

Ottengo il seguente errore: "Resources" non contiene una definizione per "GetString".
Lechucico

È necessario solo ResourceManagerquando si desidera caricare una risorsa esterna. Usa <Namespace>.Propertiesinvece.
Yousha Aleayoub

29

Apri il file .resx e imposta "Access Modifier" su Public.

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

2
questo metodo funziona con più file di risorse (lingue), perché ovunque guardo usano il metodo ResourceManager, e mi chiedo se dovrei rischiare di usarlo in questo modo, o no ...
deadManN

1
Non funziona. Il mio file di risorse non viene mostrato dopo Properties.Resources. "My filename" anche se è impostato su public
user1804084

27

Supponendo che il file .resx sia stato aggiunto utilizzando Visual Studio nelle proprietà del progetto, esiste un modo più semplice e meno soggetto a errori per accedere alla stringa.

  1. L'espansione del file .resx in Esplora soluzioni dovrebbe mostrare un file .Designer.cs.
  2. Quando viene aperto, il file .Designer.cs ha uno spazio dei nomi Properties e una classe interna. Per questo esempio si supponga che la classe sia denominata Resources.
  3. L'accesso alla stringa è quindi facile come:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. Sostituisci JoshCodes.Core.Testing.Unitcon lo spazio dei nomi predefinito del progetto.

  5. Sostituisci "exampleXml" con il nome della tua risorsa stringa.

3
Molto utile. Grazie.
ejmin

16

Seguito dalla risposta @JeffH, consiglio di utilizzare il typeof()nome dell'assembly di stringhe.

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

10

Se per qualche motivo non è possibile inserire i file delle risorse in App_GlobalResources, è possibile aprire i file delle risorse direttamente utilizzando ResXResourceReader o un lettore XML.

Ecco un esempio di codice per l'utilizzo di 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 "";
   }

Grazie, nota che devi aggiungere un riferimento a System.Windows.Formsda utilizzare System.Resources.ResXResourceReader. Inoltre, puoi fare var enumerator = rsxr.OfType<DictionaryEntry>();e usare LINQ invece.
Dunc

È molto difficile trovare articoli o post su come "leggere, analizzare e caricare" un file resx. Tutto quello che ottieni è "usa il resx come contenitore per le stringhe del tuo progetto". Grazie per questa risposta!
Simone

9

Dopo aver aggiunto una risorsa (Name: ResourceName e Value: ResourceValue) alla soluzione / assembly, è possibile utilizzare semplicemente "Properties.Resources.ResourceName" per ottenere la risorsa richiesta.


7

Ho aggiunto il file .resx tramite Visual Studio. Questo ha creato un designer.csfile con proprietà per restituire immediatamente il valore di qualsiasi chiave che volevo. Ad esempio, questo è un codice generato automaticamente dal file del designer.

/// <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);
    }
}

In questo modo, sono stato in grado di fare semplicemente:

string message = Errors.MyErrorMessage;

Dov'è Errorsil Errors.resxfile creato tramite Visual Studio ed MyErrorMessageè la chiave.


Sì, l'ho appena fatto oggi è VS2015. Fare clic con il tasto destro, aggiungere il file "Risorse" e qualsiasi chiave diventerà "dottable". Quindi è possibile accedere a "MyResx.resx" con una chiave "Script" come stringa scriptValue = MyResx.Script;
emery.noel

5

Ho aggiunto direttamente il mio file di risorse al mio progetto, quindi sono stato in grado di accedere alle stringhe all'interno con il nome del file resx.

Esempio: in Resource1.resx, chiave "resourceKey" -> stringa "dataString". Per ottenere la stringa "dataString", è sufficiente inserire Resource1.resourceKey.

Potrebbero esserci ragioni per non farlo di cui non sono a conoscenza, ma per me ha funzionato.


3

Il modo più semplice per farlo è:

  1. Crea una cartella di sistema App_GlobalResources e aggiungi un file di risorse ad essa, ad esempio Messages.resx
  2. Crea le tue voci nel file delle risorse, ad esempio ErrorMsg = Questo è un errore.
  3. Quindi per accedere a quella voce: string errormsg = Resources.Messages.ErrorMsg

2

Il modo più semplice per ottenere valore dal file di risorse. Aggiungi file di risorse nel progetto. Ora prendi la stringa dove vuoi aggiungere come nel mio caso fosse un blocco di testo (SilverLight). Non è necessario aggiungere anche alcuno spazio dei nomi. Nel mio caso funziona bene

txtStatus.Text = Constants.RefractionUpdateMessage;

Constants è il nome del mio file di risorse nel progetto.Ecco come appare il mio file di risorse


0

Crea un gestore delle risorse per recuperare le risorse.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = nome della stringa da recuperare dal file di risorse


0

Questo funziona per me. diciamo di avere un file strings.resx con una stringa ok al suo interno. per leggerlo

String varOk = My.Resources.strings.ok
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.