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

Cisne Vermelho
fonte
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");
JeffH
fonte
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
Nathanchere
fonte
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;
Muru Bakthavachalam
fonte
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>
SasHok.Tk
fonte
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.
Joshcodes
fonte
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"));
Youngjae
fonte
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 "";
   }
WWC
fonte
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.

Raghunath Rajendren
fonte
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.

Justin Skiles
fonte
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.

Eliezer Miron
fonte
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
Nomad77
fonte
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

PRATEEK GHOSH
fonte
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

Logan412
fonte
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
Miguel Silva
fonte