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


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");

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

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;

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>

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.

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"));

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 "";
   }

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.


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.


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í.


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

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


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.