2009-10-02 20 views
70

Jak odczytać ciąg z pliku .resx wC#? proszę przesłać mi wytyczne. krok po krokuodczytać ciąg z pliku .resx w C#

+14

dlaczego? Jeśli nie zadowalają mnie moje pytania, to dlaczego muszę przyjąć złe sugestie? –

+1

Jeśli plik .resx został dodany za pomocą Visual Studio w ramach właściwości projektu, zobacz [moja odpowiedź] (http://stackoverflow.com/questions/1508570/read-string-from-resx-file-in-c-sharp/ 18214592 # 18214592) dla łatwiejszego i mniej podatnego na błędy sposobu dostępu do napisu. – Joshcodes

+0

Zobacz [to] (http://snipplr.com/view/2140/csharp-reading-string-from-resource-file------------------ - /) link, to powinno pomóc. –

Odpowiedz

66

Ten przykład jest z MSDN page on 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"); 
+9

Co to jest "przedmioty" w kodzie? –

+3

Ze strony MSDN, do której się odwoływałem: nazwa_bazowa Nazwa główna pliku zasobu bez jego rozszerzenia, ale z uwzględnieniem w pełni kwalifikowanej nazwy 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 –

21

Otwarte .resx pliku i ustaw "Access modyfikator" publicznie.

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

czy ta metoda działa z wieloma plikami zasobów (językami), ponieważ wszędzie tam, gdzie wyglądam, używają metody ResourceManager, i jestem ciekawy, czy powinienem ryzykować używanie w ten sposób, czy nie ... – deadManN

61

Menedżer zasobów nie powinien być potrzebny, chyba że ładujesz z zewnętrznego źródła. Dla większości rzeczy, powiedzmy, że stworzyłeś projekt (DLL, WinForms, cokolwiek), wystarczy użyć przestrzeni nazw projektu, "Zasobów" i identyfikatora zasobu. np:

Zakładając nazw projektu: UberSoft.WidgetPro

A twój RESX zawiera:

resx content example

można po prostu użyć:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED 

Niektóre dokumentacja na ten temat znajduje się w MSDN: How to: Retrieve Resource Values Programmatically.

19

Założenie, że plik .resx został dodany za pomocą Visual Studio w ramach właściwości projektu, jest łatwiejszy i mniej podatny na błędy sposób dostępu do łańcucha.

  1. Po rozszerzeniu pliku .resx w eksploratorze rozwiązań powinien zostać wyświetlony plik .Designer.cs.
  2. Po otwarciu plik .Designer.cs ma przestrzeń nazw właściwości i klasę wewnętrzną. W tym przykładzie załóżmy, że klasa nazywa się Zasoby.
  3. Dostęp ciąg jest wtedy tak łatwe, jak:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager; 
    var exampleXmlString = resourceManager.GetString("exampleXml"); 
    
  4. Wymień JoshCodes.Core.Testing.Unit z domyślnej przestrzeni nazw projektu.

  5. Zastąp "przykładXml" nazwą zasobu ciągów.
+1

To działa dla mnie, dzięki –

+1

Bardzo pomocne. Dzięki. – ejmin

2

Najprostszym sposobem na to jest:

  1. Utwórz folder systemowy App_GlobalResources i dodać plik zasobów do niego 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 wpisu: string ErrorMsg = Resources.Messages.ErrorMsg
38

Spróbuj tego, działa na mnie .. proste

Załóżmy, że nazwa pliku zasobów jest „TestResource.RESX”, a chcesz przekazać klucz dynamicznie wtedy,

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

Dodaj Przestrzeń nazw

using System.Resources; 
5

Dodałem plik .resx poprzez Visual Studio. Ten utworzony plik designer.cs o właściwościach natychmiastowego zwrotu wartości .. z dowolnego klawisza chciałem na przykład, jest to niektóre automatycznie wygenerowany kod 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 udało mi się po prostu zrobić:

string message = Errors.MyErrorMessage; 

Gdzie Errors jest plik Errors.resx stworzony przez Visual Studio i MyErrorMessage jest kluczem.

+0

Tak, właśnie to zrobiłem dzisiaj VS2015. Kliknij prawym przyciskiem myszy, dodaj plik "Zasoby", a wszystkie klawisze staną się "spacje". Więc "MyResx.resx "z kluczem" Skrypt "może być dostępny tak jak string scriptValue = MyResx.Script; –

12

Po odpowiedzi @JeffH polecam użyć typeof() niż nazwy zespołu ciągów.

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

Jeśli z jakiegoś powodu nie można umieścić pliki zasobów w App_GlobalResources, wtedy można otworzyć zasoby pliki bezpośrednio za pomocą ResXResourceReader lub czytniku XML.

Oto przykładowy kod do korzystania z 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 ""; 
    } 
+0

Dzięki, zwróć uwagę, że musisz dodać odniesienie do' System.Windows.Forms', aby użyć 'System.Resources.ResXResourceReader'. Również , możesz zrobić 'var enumerator = rsxr.OfType ();' i zamiast tego użyj LINQ – Dunc

+0

Bardzo trudno jest znaleźć artykuły lub posty o tym, jak "czytać, parsować i ładować" plik resx. to "użyj resx jako kontenera dla ciągów twojego projektu." Dziękuję za tę odpowiedź! – Simone

4

dodałam mój plik zasobów bezpośrednio do mojego projektu, a więc byłem w stanie uzyskać dostęp do ciągów wewnątrz dobrze z RESX nazwy pliku.

Przykład: w pliku Resource1.resx, klucz "resourceKey" -> ciąg "dataString". Aby uzyskać ciąg "dataString", wystarczy umieścić Resource1.resourceKey.

Może być powód, żeby tego nie robić, o czym nie wiem, ale to zadziałało.

6

Po dodaniu zasobu (nazwa: nazwa zasobu i wartość: wartość zasobu) do rozwiązania/zespołu można po prostu użyć "Properties.Resources.ResourceName", aby uzyskać wymagany zasób.

Powiązane problemy