ler string do arquivo .resx em C #


99

Como ler a string do arquivo .resx em c #? por favor me envie orientações. passo a passo


Dê uma olhada neste link, deve ajudar.
Adriaan Stander,

15
se eles não me satisfazem nas minhas perguntas, então porque tenho que aceitar sugestões erradas?
Red Swan

1
Se o arquivo .resx foi adicionado usando o Visual Studio nas propriedades do projeto, veja minha resposta para uma maneira mais fácil e menos sujeita a erros de acessar a string.
Joshcodes

Respostas:


75

Este exemplo é da página MSDN em 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
Na página do MSDN, fiz referência a: baseName O nome raiz do arquivo de recurso sem sua extensão, mas incluindo qualquer nome de namespace totalmente qualificado. Por exemplo, o nome raiz do arquivo de recurso denominado MyApplication.MyResource.en-US.resources é MyApplication.MyResource.
JeffH

1
items == namespace do arquivo de recurso

7
mau exemplo: você deve explicar que os itens são namespace + tipo de raiz do recurso
ActiveX

Você só precisa ResourceManagerquando quiser carregar um recurso externo. Use em seu <Namespace>.Propertieslugar.
Yousha Aleayoub

131

ResourceManagernão deve ser necessário, a menos que você esteja carregando de um recurso externo .
Para a maioria das coisas, digamos que você tenha criado um projeto (DLL, WinForms, qualquer outro), você apenas usa o namespace do projeto, "Recursos" e o identificador de recursos. por exemplo:

Assumindo um namespace de projeto: UberSoft.WidgetPro

E seu resx contém:

exemplo de conteúdo resx

Você pode apenas usar:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

4
Muito obrigado por esta resposta.
Vaishali

1
Obrigado, isso deve ser marcado como uma resposta. Muito mais claro e limpo do que a "resposta" a esta pergunta.
Jeroen Jonkman

O tipo ou namespace não existe
Paul McCarthy

53

Experimente isso, funciona para mim .. simples

Suponha que o nome do arquivo de recurso seja "TestResource.resx", e você deseja passar a chave dinamicamente,

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

Adicionar Namespace

using System.Resources;

Você também pode especificar opcionalmente a Cultura - útil se você quiser garantir uma saída específica da cultura que contradiga o padrão. por exemplo, TestResource.ResourceManager.GetString (descrição, novo CultureInfo ("en-GB"));
Ian

Obtenho o seguinte erro: 'Recursos' não contém uma definição para 'GetString'.
Lechucico

Você só precisa ResourceManagerquando quiser carregar um recurso externo. Use em seu <Namespace>.Propertieslugar.
Yousha Aleayoub

29

Abra o arquivo .resx e defina "Modificador de acesso" como Público.

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

2
este método funciona com arquivos de recursos múltiplos (idiomas), porque em todos os lugares que eu procuro eles usam o Método ResourceManager, e eu me pergunto se eu deveria arriscar usando desta forma, ou não ...
deadManN

1
Não funciona. Meu arquivo de recurso não é mostrado após Properties.Resources. "Meu nome de arquivo", mesmo se estiver definido como público
user1804084

27

Supondo que o arquivo .resx foi adicionado usando o Visual Studio nas propriedades do projeto, há uma maneira mais fácil e menos sujeita a erros de acessar a string.

  1. Expandir o arquivo .resx no Solution Explorer deve mostrar um arquivo .Designer.cs.
  2. Quando aberto, o arquivo .Designer.cs tem um namespace Properties e uma classe interna. Para este exemplo, suponha que a classe seja denominada Resources.
  3. Acessar a string é tão fácil quanto:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. Substitua JoshCodes.Core.Testing.Unitpelo namespace padrão do projeto.

  5. Substitua "exampleXml" pelo nome do seu recurso de string.

3
Muito útil. Obrigado.
ejmin

16

Seguido pela resposta @JeffH, recomendo usar o typeof()nome do assembly da string.

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

10

Se por algum motivo você não pode colocar seus arquivos de recursos em App_GlobalResources, então você pode abrir arquivos de recursos diretamente usando ResXResourceReader ou um leitor XML.

Este é um exemplo de código para usar o 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 "";
   }

Obrigado, observe que você deve adicionar uma referência System.Windows.Formspara usar System.Resources.ResXResourceReader. Além disso, você pode fazer var enumerator = rsxr.OfType<DictionaryEntry>();e usar o LINQ.
Dunc

É muito difícil encontrar artigos ou postagens sobre como "ler, analisar e carregar" um arquivo resx. Tudo o que você obtém é "use o resx como o contêiner para as strings do seu projeto". Obrigado por esta resposta!
Simone

9

Depois de adicionar um recurso (Nome: ResourceName e Valor: ResourceValue) à solução / montagem, você pode simplesmente usar "Properties.Resources.ResourceName" para obter o recurso necessário.


7

Eu adicionei o arquivo .resx via Visual Studio. Isso criou um designer.csarquivo com propriedades para retornar imediatamente o valor de qualquer chave que eu quisesse. Por exemplo, este é um código gerado automaticamente a partir do arquivo do 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);
    }
}

Dessa forma, consegui simplesmente fazer:

string message = Errors.MyErrorMessage;

Onde Errorsestá o Errors.resxarquivo criado por meio do Visual Studio e MyErrorMessageé a chave.


Sim, acabei de fazer isso é VS2015 hoje. Clique com o botão direito, adicione o arquivo "Recursos" e todas as chaves se tornam "dottable". Portanto, "MyResx.resx" com uma chave "Script" pode ser acessado como string scriptValue = MyResx.Script;
emery.noel

5

Eu adicionei meu arquivo de recursos diretamente ao meu projeto e, portanto, fui capaz de acessar as strings dentro de forma perfeita com o nome do arquivo resx.

Exemplo: em Resource1.resx, chave "resourceKey" -> string "dataString". Para obter a string "dataString", acabei de colocar Resource1.resourceKey.

Pode haver razões para não fazer isso que eu não conheço, mas funcionou para mim.


3

A maneira mais fácil de fazer isso é:

  1. Crie uma pasta de sistema App_GlobalResources e adicione um arquivo de recurso a ela, por exemplo, Messages.resx
  2. Crie suas entradas no arquivo de recurso, por exemplo, ErrorMsg = Isto é um erro.
  3. Em seguida, para acessar essa entrada: string errormsg = Resources.Messages.ErrorMsg

2

A maneira mais simples de obter valor do arquivo de recurso. Adicione o arquivo de recursos no projeto. Agora pegue a string onde deseja adicionar, como no meu caso, era um bloco de texto (SilverLight). Não há necessidade de adicionar qualquer namespace também. Está funcionando bem no meu caso

txtStatus.Text = Constants.RefractionUpdateMessage;

Constantes é meu nome de arquivo de recurso no projeto.Aqui, como meu arquivo de recurso se parece


0

Crie um gerenciador de recursos para recuperar recursos.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = nome da string a ser recuperada do arquivo de recurso


0

Isso funciona para mim. digamos que você tenha um arquivo strings.resx com a string ok nele. para ler isso

String varOk = My.Resources.strings.ok
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.