leer la cadena del archivo .resx en C #

99

¿Cómo leer la cadena del archivo .resx en c #? por favor envíeme pautas. paso a paso

Cisne rojo
fuente
Eche un vistazo a este enlace, debería ayudar.
Adriaan Stander
15
¿Por qué? Si no me satisfacen con mis preguntas, ¿por qué tengo que aceptar sugerencias incorrectas?
Red Swan
1
Si el archivo .resx se agregó usando Visual Studio en las propiedades del proyecto, vea mi respuesta para obtener una forma más fácil y menos propensa a errores de acceder a la cadena.
Joshcodes

Respuestas:

75

Este ejemplo es de la página de MSDN en 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");
JeffH
fuente
4
Desde la página de MSDN a la que hice referencia: baseName El nombre raíz del archivo de recursos sin su extensión pero incluyendo cualquier nombre de espacio de nombres completo. Por ejemplo, el nombre raíz del archivo de recursos denominado MyApplication.MyResource.en-US.resources es MyApplication.MyResource.
JeffH
1
items == espacio de nombres del archivo de recursos
7
mal ejemplo: debe explicar que los elementos son espacio de nombres + tipo raíz del recurso
ActiveX
Solo lo necesita ResourceManagercuando desea cargar un recurso externo. Úselo en su <Namespace>.Propertieslugar.
Yousha Aleayoub
131

ResourceManagerno debería ser necesario a menos que esté cargando desde un recurso externo .
Para la mayoría de las cosas, digamos que ha creado un proyecto (DLL, WinForms, lo que sea), simplemente usa el espacio de nombres del proyecto, "Recursos" y el identificador de recursos. p.ej:

Suponiendo un espacio de nombres de proyecto: UberSoft.WidgetPro

Y tu resx contiene:

ejemplo de contenido resx

Puedes usar:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
Nathanchere
fuente
4
Muchas gracias por esta respuesta.
Vaishali
1
Gracias, esto debe marcarse como una respuesta. Mucho más claro y limpio que la "respuesta" de esta pregunta.
Jeroen Jonkman
El tipo o espacio de nombres no existe
Paul McCarthy
53

Prueba esto, funciona para mí .. simple

Suponga que el nombre de su archivo de recursos es "TestResource.resx" y desea pasar la clave de forma dinámica,

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

Agregar espacio de nombres

using System.Resources;
Muru Bakthavachalam
fuente
También puede especificar opcionalmente la cultura, lo que resulta útil si desea garantizar una salida específica de la cultura que contradice el valor predeterminado. por ejemplo, TestResource.ResourceManager.GetString (descripción, nueva CultureInfo ("en-GB"));
Ian
Obtengo el siguiente error: 'Recursos' no contiene una definición para 'GetString'.
Lechucico
Solo lo necesita ResourceManagercuando desea cargar un recurso externo. Úselo en su <Namespace>.Propertieslugar.
Yousha Aleayoub
29

Abra el archivo .resx y establezca "Modificador de acceso" en Público.

var <Variable Name> = Properties.Resources.<Resource Name>
SasHok.Tk
fuente
2
¿Este método funciona con múltiples archivos de recursos (idiomas)
Porque dondequiera
1
No funciona. Mi archivo de recursos no se muestra después de Properties.Resources. "My filename" incluso si está configurado como público
user1804084
27

Suponiendo que el archivo .resx se agregó usando Visual Studio en las propiedades del proyecto, existe una forma más fácil y menos propensa a errores de acceder a la cadena.

  1. Expandir el archivo .resx en el Explorador de soluciones debería mostrar un archivo .Designer.cs.
  2. Cuando se abre, el archivo .Designer.cs tiene un espacio de nombres Propiedades y una clase interna. Para este ejemplo, suponga que la clase se llama Recursos.
  3. Acceder a la cadena es tan fácil como:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
    
  4. Reemplazar JoshCodes.Core.Testing.Unitcon el espacio de nombres predeterminado del proyecto.

  5. Reemplaza "exampleXml" con el nombre de tu recurso de cadena.
Joshcodes
fuente
3
Muy útil. Gracias.
ejmin
16

Seguido por la respuesta de @JeffH, recomiendo usar el typeof()nombre del ensamblaje de cadena.

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

Si por alguna razón no puede poner sus archivos de recursos en App_GlobalResources, entonces puede abrir archivos de recursos directamente usando ResXResourceReader o un lector XML.

Aquí está el código de muestra para usar 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 "";
   }
WWC
fuente
Gracias, tenga en cuenta que debe agregar una referencia System.Windows.Formspara usar System.Resources.ResXResourceReader. Además, puede hacer var enumerator = rsxr.OfType<DictionaryEntry>();y usar LINQ en su lugar.
Dunc
Es muy difícil encontrar artículos o publicaciones sobre cómo "leer, analizar y cargar" un archivo resx. Todo lo que obtienes es "usa el resx como contenedor para las cadenas de tu proyecto". ¡Gracias por esta respuesta!
Simone
9

Una vez que agregue un recurso (Nombre: ResourceName y Value: ResourceValue) a la solución / ensamblado, simplemente puede usar "Properties.Resources.ResourceName" para obtener el recurso requerido.

Raghunath Rajendren
fuente
7

Agregué el archivo .resx a través de Visual Studio. Esto creó un designer.csarchivo con propiedades para devolver inmediatamente el valor de cualquier clave que quisiera. Por ejemplo, este es un código generado automáticamente desde el archivo del diseñador.

/// <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 esa manera, simplemente pude hacer:

string message = Errors.MyErrorMessage;

Donde Errorsestá el Errors.resxarchivo creado a través de Visual Studio y MyErrorMessagees la clave.

Justin Skiles
fuente
Sí, acabo de hacer esto hoy en VS2015. Haga clic con el botón derecho, agregue el archivo "Recursos" y cualquier clave se convertirá en "tabla de puntos". Por lo tanto, se puede acceder a "MyResx.resx" con una clave "Script" como string scriptValue = MyResx.Script;
emery.noel
5

Agregué mi archivo de recursos a mi proyecto directamente, por lo que pude acceder a las cadenas internas sin problemas con el nombre del archivo resx.

Ejemplo: en Resource1.resx, clave "resourceKey" -> cadena "dataString". Para obtener la cadena "dataString", solo puse Resource1.resourceKey.

Puede haber razones para no hacer esto que no conozco, pero funcionó para mí.

Eliezer Miron
fuente
3

La forma más sencilla de hacerlo es:

  1. Cree una carpeta del sistema App_GlobalResources y agregue un archivo de recursos, por ejemplo, Messages.resx
  2. Cree sus entradas en el archivo de recursos, por ejemplo, ErrorMsg = Esto es un error.
  3. Luego, para acceder a esa entrada: string errormsg = Resources.Messages.ErrorMsg
Nomad77
fuente
2

La forma más sencilla de obtener valor del archivo de recursos. Agregue el archivo de recursos en el proyecto. Ahora obtenga la cadena donde desea agregar, como en mi caso, era un bloque de texto (SilverLight). No es necesario agregar ningún espacio de nombres también. Funciona bien en mi caso

txtStatus.Text = Constants.RefractionUpdateMessage;

Constants es mi nombre de archivo de recursos en el proyecto.Aquí cómo se ve mi archivo de recursos

PRATEEK GHOSH
fuente
0

Cree un administrador de recursos para recuperar recursos.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = nombre de la cadena que se recuperará del archivo de recursos

Logan412
fuente
0

Esto funciona para mi. digamos que tiene un archivo strings.resx con la cadena ok en él. para leerlo

String varOk = My.Resources.strings.ok
Miguel Silva
fuente