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


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

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

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;

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>

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.

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

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

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.


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.


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.


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

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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.