Jak odczytać ciąg z pliku resx w języku C #? proszę o przesłanie wskazówek. krok po kroku
Jak odczytać ciąg z pliku resx w języku C #? proszę o przesłanie wskazówek. krok po kroku
Odpowiedzi:
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");
ResourceManagerwtedy, gdy chcesz załadować zasób zewnętrzny. Użyj <Namespace>.Propertieszamiast tego.
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:

Możesz po prostu użyć:
Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
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;
ResourceManagerwtedy, gdy chcesz załadować zasób zewnętrzny. Użyj <Namespace>.Propertieszamiast tego.
Otwórz plik resx i ustaw „Modyfikator dostępu” na Publiczny.
var <Variable Name> = Properties.Resources.<Resource Name>
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:
var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
var exampleXmlString = resourceManager.GetString("exampleXml");Zastąp JoshCodes.Core.Testing.Unitdomyślną przestrzenią nazw projektu.
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 "";
}
System.Windows.Formsdo użycia System.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.
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.
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
txtStatus.Text = Constants.RefractionUpdateMessage;
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