Как прочитать строку из файла .resx в С#? пожалуйста, пришлите мне рекомендации. шаг за шагом
прочитать строку из файла .resx в С#
Ответы (14)
Этот пример взят со страницы MSDN в 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");
ResourceManager
, когда вы хотите загрузить внешний ресурс. Вместо этого используйте <Namespace>.Properties
.
- person Yousha Aleayoub; 13.04.2020
ResourceManager
не требуется, если вы не загружаете из внешнего ресурса.
В большинстве случаев, скажем, вы создали проект (DLL, WinForms и т. д.), вы просто используете проект пространство имен, «Ресурсы» и идентификатор ресурса. например:
Предполагая пространство имен проекта: UberSoft.WidgetPro
И ваш resx содержит:
Вы можете просто использовать:
Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
Попробуйте это, у меня работает .. просто
Предположим, что имя вашего файла ресурсов «TestResource.resx», и вы хотите динамически передать ключ,
string resVal = TestResource.ResourceManager.GetString(dynamicKeyVal);
Добавить пространство имен
using System.Resources;
ResourceManager
, когда вы хотите загрузить внешний ресурс. Вместо этого используйте <Namespace>.Properties
.
- person Yousha Aleayoub; 13.04.2020
Откройте файл .resx и установите для параметра «Модификатор доступа» значение «Общий».
var <Variable Name> = Properties.Resources.<Resource Name>
Предполагая, что файл .resx был добавлен с помощью Visual Studio в свойствах проекта, существует более простой и менее подверженный ошибкам способ доступа к строке.
- При развертывании файла .resx в обозревателе решений должен отображаться файл .Designer.cs.
- При открытии файл .Designer.cs имеет пространство имен Properties и внутренний класс. В этом примере предположим, что класс называется Resources.
Доступ к строке тогда так же прост, как:
var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager; var exampleXmlString = resourceManager.GetString("exampleXml");
Замените
JoshCodes.Core.Testing.Unit
пространством имен проекта по умолчанию.- Замените «exampleXml» на имя вашего строкового ресурса.
После ответа @JeffH я рекомендую использовать typeof()
, чем имя сборки строки.
var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));
Если по какой-то причине вы не можете поместить файлы ресурсов в App_GlobalResources, вы можете открыть файлы ресурсов напрямую с помощью ResXResourceReader или XML Reader.
Вот пример кода для использования 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.Forms
, чтобы использовать System.Resources.ResXResourceReader
. Кроме того, вы можете сделать var enumerator = rsxr.OfType<DictionaryEntry>();
и вместо этого использовать LINQ.
- person Dunc; 18.12.2015
Я добавил файл .resx через Visual Studio. Это создало файл designer.cs
со свойствами, чтобы немедленно вернуть значение любого ключа, который я хотел. Например, это какой-то автоматически сгенерированный код из файла конструктора.
/// <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);
}
}
Таким образом, я смог просто сделать:
string message = Errors.MyErrorMessage;
Где Errors
— это файл Errors.resx
, созданный с помощью Visual Studio, а MyErrorMessage
— это ключ.
Как только вы добавите ресурс (Имя: ResourceName и Значение: ResourceValue) в решение/сборку, вы можете просто использовать «Properties.Resources.ResourceName», чтобы получить требуемый ресурс.
Я добавил свой файл ресурсов в свой проект напрямую, и поэтому я смог получить доступ к строкам внутри просто с именем файла resx.
Пример: в Resource1.resx ключ "resourceKey" -> строка "dataString". Чтобы получить строку «dataString», я просто поместил Resource1.resourceKey.
Могут быть причины не делать этого, о которых я не знаю, но это сработало для меня.
Самый простой способ сделать это:
- Создайте системную папку App_GlobalResources и добавьте в нее файл ресурсов, например. Сообщения.resx
- Создайте свои записи в файле ресурсов, например. ErrorMsg = Это ошибка.
- Затем для доступа к этой записи: string errormsg = Resources.Messages.ErrorMsg
Самый простой способ получить значение из файла ресурсов. Добавьте файл ресурсов в проект. Теперь получите строку, в которую вы хотите добавить, как в моем случае, это был текстовый блок (SilverLight). Не нужно также добавлять какое-либо пространство имен. В моем случае это работает нормально.
txtStatus.Text = Constants.RefractionUpdateMessage;
Константы — это имя моего файла ресурсов в проекте.
Создайте диспетчер ресурсов для извлечения ресурсов.
ResourceManager rm = new ResourceManager("param1",Assembly.GetExecutingAssembly());
String str = rm.GetString("param2");
param1 = "ИмяСборки.ИмяПапкиРесурса.ИмяФайлаРесурса"
param2 = имя строки, которую нужно получить из файла ресурсов
Это работает для меня. скажем, у вас есть файл strings.resx со строкой ok. прочитать это
String varOk = My.Resources.strings.ok