читати рядок з .resx-файлу в C #


99

Як читати рядок з .resx-файлу в c #? будь ласка, надішліть мені рекомендації. крок за кроком


Подивіться на це посилання, це повинно допомогти.
Адріан Стандер

15
чому? Якщо вони не задовольнили мене у своїх питаннях, то чому я маю приймати неправильні пропозиції?
Червоний лебідь

1
Якщо файл .resx був доданий за допомогою Visual Studio під властивостями проекту, дивіться мою відповідь простіший та менший спосіб схильності до доступу до рядка.
Joshcodes

Відповіді:


75

Цей приклад зі сторінки 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 == Простір імен файлу ресурсу

7
поганий приклад: вам слід пояснити, що елементи є простором імен + кореневий тип ресурсу
ActiveX

Вам потрібно лише ResourceManagerтоді, коли ви хочете завантажити зовнішній ресурс. Використовуйте <Namespace>.Propertiesзамість цього.
Yousha Aleayoub

131

ResourceManagerне потрібна, якщо ви не завантажуєтесь із зовнішнього ресурсу.
Скажімо, для більшості речей ви створили проект (DLL, WinForms, що завгодно), ви просто використовуєте простір імен проектів, "Ресурси" та ідентифікатор ресурсу. наприклад:

Припускаючи простір імен проекту: UberSoft.WidgetPro

І ваш рекс містить:

Приклад вмісту 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замість цього.
Yousha Aleayoub

29

Відкрийте файл .resx та встановіть "Модифікатор доступу" на "Загальнодоступне".

var <Variable Name> = Properties.Resources.<Resource Name>

2
чи працює цей метод з декількома файлами ресурсів (мовами), тому що там, де я дивлюсь, вони використовують метод ResourceManager, і мені цікаво, чи варто ризикувати цим способом, чи ні ...
deadManN

1
Не працює. Мій файл ресурсу не відображається після Properties.Resources. "
Myname file

27

Якщо припустити, що файл .resx був доданий за допомогою Visual Studio під властивостями проекту, існує простіший і менш схильний спосіб доступу до рядка.

  1. Розширення .resx-файлу в Провіднику рішень повинно відображати файл .Designer.cs.
  2. Після відкриття файл .Designer.cs має простір імен властивостей та внутрішній клас. Для цього прикладу припустимо, що клас називається Resources.
  3. Тоді доступ до рядка простий, як:

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

  5. Замініть "exampleXml" на ім'я вашого рядкового ресурсу.

3
Дуже корисний. Дякую.
ejmin

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 "";
   }

Дякуємо, зауважте, що вам потрібно додати посилання System.Windows.Formsна користування System.Resources.ResXResourceReader. Крім того, ви можете робити var enumerator = rsxr.OfType<DictionaryEntry>();та використовувати LINQ замість цього.
Данк

Дуже важко знайти статті чи публікації про те, як "читати, розбирати та завантажувати" файл resx. Все, що ви отримуєте - це "використовувати resx як контейнер для рядків вашого проекту". Дякую за цю відповідь!
Симоне

9

Як тільки ви додасте ресурс (Ім'я: ім'я ресурсу та значення: 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" можна отримати доступ, як string 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

2

Найпростіший спосіб отримати значення з файлу ресурсу. Додати файл ресурсу в проект. Тепер знайдіть рядок, куди ви хочете додати, як у моєму випадку це був текстовий блок (SilverLight). Не потрібно також додавати простір імен. У моєму випадку він справно працює

txtStatus.Text = Constants.RefractionUpdateMessage;

Константи - це моє ім’я файлу ресурсу в проекті.Ось як виглядає мій ресурсний файл


0

Створіть менеджер ресурсів для отримання ресурсів.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

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


0

Це працює для мене. скажімо, у вас є файл strings.resx з рядком нормально. читати його

String varOk = My.Resources.strings.ok
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.