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.
// Create a resource manager to retrieve resources.ResourceManager rm =newResourceManager("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");
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:
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.
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.
Rozwinięcie pliku resx w Eksploratorze rozwiązań powinno pokazać plik .Designer.cs.
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.
Dostęp do ciągu jest wtedy tak prosty, jak:
var resourceManager =JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;var exampleXmlString = resourceManager.GetString("exampleXml");
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:
publicstaticstringGetResourceString(stringResourceName,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 nameList<string> resourceFileNameList =newList<string>();DirectoryInfo resourceDir =newDirectoryInfo(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 culturestring 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;}elseif(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.aspxResXResourceReader rsxr =newResXResourceReader(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.
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>publicstaticstringMyErrorMessage{get{returnResourceManager.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.
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
Odpowiedzi:
Ten przykład pochodzi ze strony MSDN w ResourceManager.GetString () :
źródło
ResourceManager
wtedy, gdy chcesz załadować zasób zewnętrzny. Użyj<Namespace>.Properties
zamiast tego.ResourceManager
nie 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:
Możesz po prostu użyć:
źródło
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,
Dodaj przestrzeń nazw
źródło
ResourceManager
wtedy, gdy chcesz załadować zasób zewnętrzny. Użyj<Namespace>.Properties
zamiast tego.Otwórz plik resx i ustaw „Modyfikator dostępu” na Publiczny.
źródło
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.
Dostęp do ciągu jest wtedy tak prosty, jak:
Zastąp
JoshCodes.Core.Testing.Unit
domyślną przestrzenią nazw projektu.źródło
Po odpowiedzi @JeffH, polecam użyć
typeof()
nazwy zestawu niż string.źródło
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:
źródło
System.Windows.Forms
do użyciaSystem.Resources.ResXResourceReader
. Możesz równieżvar enumerator = rsxr.OfType<DictionaryEntry>();
zamiast tego używać LINQ.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.
źródło
Dodałem plik resx przez Visual Studio. Spowodowało to utworzenie
designer.cs
pliku z właściwościami, które natychmiast zwracały wartość dowolnego klucza. Na przykład jest to kod generowany automatycznie z pliku projektanta.W ten sposób mogłem po prostu zrobić:
Gdzie
Errors
jestErrors.resx
plik utworzony za pomocą programu Visual Studio iMyErrorMessage
jest kluczem.źródło
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.
źródło
Najłatwiej to zrobić:
źródło
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
Stałe to nazwa mojego pliku zasobów w projekcie.
źródło
Utwórz menedżera zasobów, aby pobierać zasoby.
źródło
To działa dla mnie. powiedz, że masz plik strings.resx z ciągiem znaków w porządku. przeczytać
źródło