прочитать строку из файла .resx в С#

Как прочитать строку из файла .resx в С#? пожалуйста, пришлите мне рекомендации. шаг за шагом


person Red Swan    schedule 02.10.2009    source источник
comment
Взгляните на эта ссылка, это должно помочь.   -  person Adriaan Stander    schedule 02.10.2009
comment
почему? Если они не удовлетворили меня по моим вопросам, то почему я должен принимать неправильные предложения?   -  person Red Swan    schedule 27.07.2010
comment
Если файл .resx был добавлен с помощью Visual Studio в свойствах проекта, см. мой ответ для более простого и менее подверженного ошибкам способа доступа к строке.   -  person Joshcodes    schedule 13.08.2013


Ответы (14)



ResourceManager не требуется, если вы не загружаете из внешнего ресурса.
В большинстве случаев, скажем, вы создали проект (DLL, WinForms и т. д.), вы просто используете проект пространство имен, «Ресурсы» и идентификатор ресурса. например:

Предполагая пространство имен проекта: UberSoft.WidgetPro

И ваш resx содержит:

пример содержимого resx

Вы можете просто использовать:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
person nathanchere    schedule 10.12.2012
comment
Большое спасибо за этот ответ. - person Vaishali; 18.12.2018
comment
Спасибо, это должно быть помечено как ответ. Гораздо яснее и чище, чем ответ на этот вопрос. - person M1sterPl0w; 22.02.2020
comment
Тип или пространство имен не существует - person Paul McCarthy; 25.02.2020
comment
Спасибо, бро!!!!!! - person Vesper; 20.02.2021

Попробуйте это, у меня работает .. просто

Предположим, что имя вашего файла ресурсов «TestResource.resx», и вы хотите динамически передать ключ,

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

Добавить пространство имен

using System.Resources;
person Muru Bakthavachalam    schedule 19.03.2014
comment
Вы также можете дополнительно указать культуру — полезно, если вы хотите, чтобы выходные данные, зависящие от культуры, противоречили значениям по умолчанию. например TestResource.ResourceManager.GetString (описание, новая информация о культуре (en-GB)); - person Ian; 24.04.2019
comment
Я получаю следующую ошибку: «Ресурсы» не содержат определения для «GetString». - person Lechucico; 11.06.2019
comment
Вам нужно только ResourceManager, когда вы хотите загрузить внешний ресурс. Вместо этого используйте <Namespace>.Properties. - person Yousha Aleayoub; 13.04.2020

Откройте файл .resx и установите для параметра «Модификатор доступа» значение «Общий».

var <Variable Name> = Properties.Resources.<Resource Name>
person SasHok.Tk    schedule 16.07.2012
comment
работает ли этот метод с несколькими файлами ресурсов (языками), потому что везде, где я смотрю, они используют метод ResourceManager, и мне интересно, стоит ли мне рисковать, используя этот способ, или нет... - person deadManN; 14.09.2015
comment
Не работает. Мой файл ресурсов не отображается после имени файла Properties.Resources.my, даже если он установлен как общедоступный - person user1804084; 08.04.2019

Предполагая, что файл .resx был добавлен с помощью Visual Studio в свойствах проекта, существует более простой и менее подверженный ошибкам способ доступа к строке.

  1. При развертывании файла .resx в обозревателе решений должен отображаться файл .Designer.cs.
  2. При открытии файл .Designer.cs имеет пространство имен Properties и внутренний класс. В этом примере предположим, что класс называется Resources.
  3. Доступ к строке тогда так же прост, как:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
    
  4. Замените JoshCodes.Core.Testing.Unit пространством имен проекта по умолчанию.

  5. Замените «exampleXml» на имя вашего строкового ресурса.
person Joshcodes    schedule 13.08.2013
comment
Очень полезно. Спасибо. - person Dan; 05.05.2016

После ответа @JeffH я рекомендую использовать typeof(), чем имя сборки строки.

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

Если по какой-то причине вы не можете поместить файлы ресурсов в 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 "";
   }
person WWC    schedule 27.04.2015
comment
Спасибо, обратите внимание, что вы должны добавить ссылку на System.Windows.Forms, чтобы использовать System.Resources.ResXResourceReader. Кроме того, вы можете сделать var enumerator = rsxr.OfType<DictionaryEntry>(); и вместо этого использовать LINQ. - person Dunc; 18.12.2015
comment
Очень сложно найти статьи или сообщения о том, как читать, анализировать и загружать файл resx. Все, что вы получаете, это использовать resx в качестве контейнера для строк вашего проекта. Спасибо за этот ответ! - person Simone; 14.07.2017

Я добавил файл .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 — это ключ.

person Justin Skiles    schedule 03.10.2014
comment
Да, я только что сделал это сегодня VS2015. Щелкните правой кнопкой мыши, добавьте файл ресурсов, и любые ключи станут точечными. Таким образом, к MyResx.resx с ключом Script можно получить доступ как к строке scriptValue = MyResx.Script; - person emery.noel; 25.01.2017
comment
Из всех приведенных выше ответов это тот, который имел для меня наибольший смысл и работал на меня. Спасибо. - person marky; 20.01.2021

Как только вы добавите ресурс (Имя: ResourceName и Значение: ResourceValue) в решение/сборку, вы можете просто использовать «Properties.Resources.ResourceName», чтобы получить требуемый ресурс.

person Raghunath Rajendren    schedule 17.02.2016

Я добавил свой файл ресурсов в свой проект напрямую, и поэтому я смог получить доступ к строкам внутри просто с именем файла resx.

Пример: в Resource1.resx ключ "resourceKey" -> строка "dataString". Чтобы получить строку «dataString», я просто поместил Resource1.resourceKey.

Могут быть причины не делать этого, о которых я не знаю, но это сработало для меня.

person Eliezer Miron    schedule 23.07.2015

Самый простой способ сделать это:

  1. Создайте системную папку App_GlobalResources и добавьте в нее файл ресурсов, например. Сообщения.resx
  2. Создайте свои записи в файле ресурсов, например. ErrorMsg = Это ошибка.
  3. Затем для доступа к этой записи: string errormsg = Resources.Messages.ErrorMsg
person Nomad77    schedule 26.01.2014

Самый простой способ получить значение из файла ресурсов. Добавьте файл ресурсов в проект. Теперь получите строку, в которую вы хотите добавить, как в моем случае, это был текстовый блок (SilverLight). Не нужно также добавлять какое-либо пространство имен. В моем случае это работает нормально.

txtStatus.Text = Constants.RefractionUpdateMessage;

Константы — это имя моего файла ресурсов в проекте.Вот как выглядит мой файл ресурсов

person PRATEEK GHOSH    schedule 06.03.2019

Создайте диспетчер ресурсов для извлечения ресурсов.

ResourceManager rm = new ResourceManager("param1",Assembly.GetExecutingAssembly());

String str = rm.GetString("param2");

param1 = "ИмяСборки.ИмяПапкиРесурса.ИмяФайлаРесурса"

param2 = имя строки, которую нужно получить из файла ресурсов

person Logan412    schedule 13.08.2019

Это работает для меня. скажем, у вас есть файл strings.resx со строкой ok. прочитать это

String varOk = My.Resources.strings.ok
person Miguel Silva    schedule 27.06.2020