web-dev-qa-db-fra.com

lire la chaîne du fichier .resx en C #

Comment lire la chaîne d'un fichier .resx en c #? s'il vous plaît envoyez-moi des directives. pas à pas

87
Red Swan

Cet exemple provient de la page MSDN sur 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");
70
JeffH

Gestionnaire de ressources ne devrait pas être nécessaire, sauf si vous chargez à partir d'une ressource externe. Pour la plupart des choses, supposons que vous ayez créé un projet (DLL, WinForms, peu importe), il vous suffit d'utiliser l'espace de nom du projet, "Ressources" et l'identifiant de la ressource. par exemple:

En supposant un espace de nom de projet: UberSoft.WidgetPro

Et votre resx contient:

resx content example

Vous pouvez simplement utiliser:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
110
nathanchere

Essayez ceci, fonctionne pour moi .. simple

Supposons que le nom de votre fichier de ressources soit "TestResource.resx" et que vous souhaitez ensuite transmettre la clé de manière dynamique.

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

Ajouter un espace de noms

using System.Resources;
47

Ouvrez le fichier .resx et définissez "Access Modifier" sur Public.

var <Variable Name> = Properties.Resources.<Resource Name>
27
SasHok.Tk

En supposant que le fichier .resx ait été ajouté à l'aide de Visual Studio sous les propriétés du projet, il existe un moyen plus facile et moins sujet aux erreurs d'accéder à la chaîne.

  1. L'extension du fichier .resx dans l'Explorateur de solutions devrait afficher un fichier .Designer.cs.
  2. Une fois ouvert, le fichier .Designer.cs a un espace de noms Propriétés et une classe interne. Pour cet exemple, supposons que la classe s'appelle Ressources.
  3. Accéder à la chaîne est alors aussi simple que:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
    
  4. Remplacer JoshCodes.Core.Testing.Unit avec l'espace de noms par défaut du projet.

  5. Remplacez "exampleXml" par le nom de votre ressource chaîne.
23
Joshcodes

Suivi par @JeffH answer, je recommande d'utiliser typeof() plutôt que la chaîne nom de l'assembly.

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

Si, pour une raison quelconque, vous ne pouvez pas placer vos fichiers de ressources dans App_GlobalResources, vous pouvez ouvrir les fichiers de ressources directement à l'aide de ResXResourceReader ou d'un lecteur XML.

Voici un exemple de code d'utilisation de 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 "";
   }
9
WWC

Une fois que vous avez ajouté une ressource (Nom: NomRessource et Valeur: ValeurRessource) à la solution/Assembly, vous pouvez simplement utiliser "Properties.Resources.ResourceName" pour obtenir la ressource requise.

8
Raghunath Rajendren

J'ai ajouté le fichier .resx via Visual Studio. Cela a créé un designer.cs fichier avec propriétés pour renvoyer immédiatement la valeur de la clé que je voulais. Par exemple, il s'agit d'un code généré automatiquement à partir du fichier de concepteur.

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

De cette façon, j'ai pu faire simplement:

string message = Errors.MyErrorMessage;

Errors est le Errors.resx fichier créé par Visual Studio et MyErrorMessage est la clé.

7
Justin Skiles

J'ai ajouté mon fichier de ressources à mon projet directement, et j'ai donc pu accéder aux chaînes contenues parfaitement avec le nom du fichier resx.

Exemple: dans Resource1.resx, clé "resourceKey" -> chaîne "dataString". Pour obtenir la chaîne "dataString", je viens de mettre Resource1.resourceKey.

Il y a peut-être des raisons de ne pas faire cela que je ne connais pas, mais cela a fonctionné pour moi.

5
Eliezer Miron

La façon la plus simple de faire ceci est:

  1. Créez un dossier système App_GlobalResources et ajoutez-y un fichier de ressources, par exemple. Messages.resx
  2. Créez vos entrées dans le fichier de ressources, par exemple. ErrorMsg = Ceci est une erreur.
  3. Ensuite, pour accéder à cette entrée: string errormsg = Resources.Messages.ErrorMsg
3
Nomad77

Créez un gestionnaire de ressources pour récupérer des ressources.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = nom de la chaîne à extraire du fichier de ressources

0
Logan412

Le moyen le plus simple d'obtenir de la valeur à partir d'un fichier de ressources. Ajouter un fichier de ressources dans le projet. Maintenant, récupérez la chaîne à ajouter, comme dans mon cas, il s'agissait d'un bloc de texte (SilverLight). Pas besoin d'ajouter un espace de noms aussi. Cela fonctionne très bien dans mon cas.

txtStatus.Text = Constants.RefractionUpdateMessage;

Constants est le nom de mon fichier de ressources dans le projet . Here how my resource file look like

0
PRATEEK GHOSH