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

100

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

Красный лебедь
источник
Взгляните на эту ссылку, это должно помочь.
Адриан Стандер,
15
почему? если меня не удовлетворили по моим вопросам, то почему я должен принимать неправильные предложения?
Red Swan
1
Если файл .resx был добавлен с помощью Visual Studio в свойствах проекта, см. Мой ответ для более простого и менее подверженного ошибкам способа доступа к строке.
Joshcodes

Ответы:

74

Этот пример взят со страницы 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");
Джефф
источник
4
На странице MSDN, на которую я ссылался: baseName Корневое имя файла ресурсов без его расширения, но включая любое полное имя пространства имен. Например, корневое имя файла ресурсов MyApplication.MyResource.en-US.resources - MyApplication.MyResource.
JeffH
1
items == пространство имен файла ресурсов
9
плохой пример: вы должны объяснить, что элементы - это пространство имен + корневой тип ресурса
ActiveX
Вам это нужно только ResourceManagerтогда, когда вы хотите загрузить внешний ресурс. <Namespace>.PropertiesВместо этого используйте .
Юша Алеайуб,
132

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

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

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

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

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

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
Натанчер
источник
4
Большое спасибо за этот ответ.
Вайшали
1
Спасибо, это должно быть отмечено как ответ. Намного яснее и чище, чем «ответ» на этот вопрос.
Йерун Йонкман,
Тип или пространство имен не существует
Пол Маккарти
53

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

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

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

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

using System.Resources;
Муру Бактхавачалам
источник
Вы также можете при желании указать культуру - полезно, если вы хотите обеспечить вывод, зависящий от языка и региональных параметров, который противоречит умолчанию. например, TestResource.ResourceManager.GetString (описание, новый CultureInfo ("en-GB"));
Ян
Я получаю следующую ошибку: «Ресурсы» не содержат определения для «GetString».
Lechucico
Вам это нужно только ResourceManagerтогда, когда вы хотите загрузить внешний ресурс. <Namespace>.PropertiesВместо этого используйте .
Юша Алеайуб,
30

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

var <Variable Name> = Properties.Resources.<Resource Name>
SasHok.Tk
источник
3
работает ли этот метод с несколькими файлами ресурсов (языками), потому что везде, куда я смотрю, они используют метод ResourceManager, и мне интересно, должен ли я рисковать, используя этот способ, или нет ...
deadManN
2
Не работает. Мой файл ресурсов не отображается после Properties.Resources. «Мое имя файла», даже если для него установлено значение public
user1804084
27

Предполагая, что файл .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 именем своего строкового ресурса.
Joshcodes
источник
3
Очень полезно. Спасибо.
ejmin 05
16

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

    var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
    string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));
Ёнджэ
источник
10

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

После добавления ресурса (Name: ResourceName и Value: ResourceValue) в решение / сборку вы можете просто использовать «Properties.Resources.ResourceName» для получения необходимого ресурса.

Рагхунатх Раджендрен
источник
7

Я добавил файл .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является ключом.

Джастин Скилс
источник
Да, я только что сделал, это VS2015 сегодня. Щелкните правой кнопкой мыши, добавьте файл «Ресурсы», и все ключи станут «точечными». Таким образом, "MyResx.resx" с ключом "Script" может быть доступен как строка scriptValue = MyResx.Script;
emery.noel
5

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

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

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

Элиэзер Мирон
источник
3

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

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

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

txtStatus.Text = Constants.RefractionUpdateMessage;

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

PRATEEK GHOSH
источник
0

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

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = имя строки, которая будет извлечена из файла ресурсов

Логан412
источник
0

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

String varOk = My.Resources.strings.ok
Мигель Сильва
источник