odczytaj ciąg z pliku resx w C #

99

Jak odczytać ciąg z pliku resx w języku C #? proszę o przesłanie wskazówek. krok po kroku

Czerwony łabędź
źródło
Spójrz na ten link, powinien pomóc.
Adriaan Stander
15
dlaczego? jeśli nie zadowalają mnie w moich pytaniach, to dlaczego muszę przyjmować błędne sugestie?
Red Swan
1
Jeśli plik resx został dodany przy użyciu programu Visual Studio we właściwościach projektu, zobacz moją odpowiedź, aby uzyskać łatwiejszy i mniej podatny na błędy sposób uzyskiwania dostępu do ciągu.
Joshcodes

Odpowiedzi:

74

Ten przykład pochodzi ze strony MSDN w 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
źródło
4
Ze strony MSDN, do której się odwołałem: baseName Nazwa główna pliku zasobów bez rozszerzenia, ale zawierająca w pełni kwalifikowaną nazwę przestrzeni nazw. Na przykład nazwa główna pliku zasobów o nazwie MyApplication.MyResource.en-US.resources to MyApplication.MyResource.
JeffH
1
items == przestrzeń nazw pliku zasobów
8
słaby przykład: powinieneś wyjaśnić, że elementy to przestrzeń nazw + typ katalogu głównego zasobu
ActiveX
Potrzebujesz tylko ResourceManagerwtedy, gdy chcesz załadować zasób zewnętrzny. Użyj <Namespace>.Propertieszamiast tego.
Yousha Aleayoub
131

ResourceManagernie powinno być potrzebne, chyba że ładujesz z zasobu zewnętrznego .
W przypadku większości rzeczy, załóżmy, że utworzyłeś projekt (DLL, WinForms, cokolwiek), po prostu używasz przestrzeni nazw projektu, „zasobów” i identyfikatora zasobu. na przykład:

Zakładając przestrzeń nazw projektu: UberSoft.WidgetPro

Twój resx zawiera:

przykład zawartości resx

Możesz po prostu użyć:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
nathanchere
źródło
4
Wielkie dzięki za tę odpowiedź.
Vaishali,
1
Dziękuję, to powinno być oznaczone jako odpowiedź. O wiele jaśniejsza i czystsza niż „odpowiedź” na to pytanie.
Jeroen Jonkman
Typ lub przestrzeń nazw nie istnieje
Paul McCarthy
53

Spróbuj tego, działa dla mnie… proste

Załóżmy, że nazwa Twojego pliku zasobów to „TestResource.resx” i chcesz wtedy przekazywać klucz dynamicznie,

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

Dodaj przestrzeń nazw

using System.Resources;
Muru Bakthavachalam
źródło
Możesz również opcjonalnie określić Culture - przydatne, jeśli chcesz zapewnić dane wyjściowe specyficzne dla kultury, które są sprzeczne z wartością domyślną. np. TestResource.ResourceManager.GetString (opis, nowe CultureInfo ("en-GB"));
Ian
Otrzymuję następujący błąd: „Zasoby” nie zawierają definicji dla „GetString”.
Lechucico
Potrzebujesz tylko ResourceManagerwtedy, gdy chcesz załadować zasób zewnętrzny. Użyj <Namespace>.Propertieszamiast tego.
Yousha Aleayoub
29

Otwórz plik resx i ustaw „Modyfikator dostępu” na Publiczny.

var <Variable Name> = Properties.Resources.<Resource Name>
SasHok.Tk
źródło
3
czy ta metoda działa z wieloma plikami zasobów (językami), ponieważ wszędzie, gdzie patrzę, używają metody ResourceManager i zastanawiam się, czy powinienem ryzykować użycie w ten sposób, czy nie ...
deadManN
2
Nie działa. Mój plik zasobów nie jest wyświetlany po
polu
27

Zakładając, że plik resx został dodany przy użyciu programu Visual Studio we właściwościach projektu, istnieje łatwiejszy i mniej podatny na błędy sposób uzyskiwania dostępu do ciągu.

  1. Rozwinięcie pliku resx w Eksploratorze rozwiązań powinno pokazać plik .Designer.cs.
  2. Po otwarciu plik .Designer.cs ma przestrzeń nazw Właściwości i klasę wewnętrzną. W tym przykładzie przyjmijmy, że klasa nosi nazwę Resources.
  3. Dostęp do ciągu jest wtedy tak prosty, jak:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. Zastąp JoshCodes.Core.Testing.Unitdomyślną przestrzenią nazw projektu.

  5. Zastąp „exampleXml” nazwą zasobu ciągu.
Joshcodes
źródło
3
Bardzo pomocne. Dzięki.
ejmin
16

Po odpowiedzi @JeffH, polecam użyć typeof()nazwy zestawu niż string.

    var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
    string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));
Youngjae
źródło
10

Jeśli z jakiegoś powodu nie możesz umieścić plików zasobów w App_GlobalResources, możesz otwierać pliki zasobów bezpośrednio za pomocą ResXResourceReader lub czytnika XML.

Oto przykładowy kod do używania 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
źródło
Dzięki, pamiętaj, że musisz dodać odwołanie System.Windows.Formsdo użycia System.Resources.ResXResourceReader. Możesz również var enumerator = rsxr.OfType<DictionaryEntry>();zamiast tego używać LINQ.
Dunc,
Bardzo trudno jest znaleźć artykuły lub posty o tym, jak „czytać, analizować i ładować” plik resx. Wszystko, co otrzymujesz, to „użyj resx jako kontenera na ciągi znaków projektu”. Dziękuję za tę odpowiedź!
Simone
9

Po dodaniu zasobu (Name: ResourceName i Value: ResourceValue) do rozwiązania / zestawu można po prostu użyć „Properties.Resources.ResourceName”, aby uzyskać wymagany zasób.

Raghunath Rajendren
źródło
7

Dodałem plik resx przez Visual Studio. Spowodowało to utworzenie designer.cspliku z właściwościami, które natychmiast zwracały wartość dowolnego klucza. Na przykład jest to kod generowany automatycznie z pliku projektanta.

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

W ten sposób mogłem po prostu zrobić:

string message = Errors.MyErrorMessage;

Gdzie Errorsjest Errors.resxplik utworzony za pomocą programu Visual Studio i MyErrorMessagejest kluczem.

Justin Skiles
źródło
Tak właśnie zrobiłem to dzisiaj VS2015. Kliknij prawym przyciskiem myszy, dodaj plik „Zasoby”, a wszystkie klawisze staną się „dottable”. Tak więc „MyResx.resx” z kluczem „Script” można uzyskać jak string scriptValue = MyResx.Script;
emery.noel
5

Dodałem plik zasobów bezpośrednio do mojego projektu, dzięki czemu mogłem uzyskać dostęp do ciągów wewnątrz z nazwą pliku resx.

Przykład: w Resource1.resx, klucz „resourceKey” -> string „dataString”. Aby uzyskać ciąg „dataString”, po prostu wstawiłem Resource1.resourceKey.

Mogą istnieć powody, aby tego nie robić, o których nie wiem, ale to zadziałało.

Eliezer Miron
źródło
3

Najłatwiej to zrobić:

  1. Utwórz folder systemowy App_GlobalResources i dodaj do niego plik zasobów, np. Messages.resx
  2. Utwórz swoje wpisy w pliku zasobów, np. ErrorMsg = To jest błąd.
  3. Następnie, aby uzyskać dostęp do tego wpisu: string errormsg = Resources.Messages.ErrorMsg
Nomad77
źródło
2

Najprostszy sposób na uzyskanie wartości z pliku zasobów. Dodaj plik zasobów do projektu. Teraz weź ciąg, w którym chcesz dodać, tak jak w moim przypadku był to blok tekstu (SilverLight). Nie ma też potrzeby dodawania przestrzeni nazw, w moim przypadku działa dobrze

txtStatus.Text = Constants.RefractionUpdateMessage;

Stałe to nazwa mojego pliku zasobów w projekcie.Oto jak wygląda mój plik zasobów

PRATEEK GHOSH
źródło
0

Utwórz menedżera zasobów, aby pobierać zasoby.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = nazwa ciągu do pobrania z pliku zasobów

Logan412
źródło
0

To działa dla mnie. powiedz, że masz plik strings.resx z ciągiem znaków w porządku. przeczytać

String varOk = My.Resources.strings.ok
Miguel Silva
źródło