прочитать строку из файла .resx в C # - PullRequest
85 голосов
/ 02 октября 2009

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

Ответы [ 12 ]

99 голосов
/ 11 декабря 2012

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

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

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

resx content example

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

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
69 голосов
/ 15 октября 2009

Этот пример взят со страницы 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");
45 голосов
/ 19 марта 2014

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

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

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

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

using System.Resources;
27 голосов
/ 17 июля 2012

Откройте файл .resx и установите для «Access Modifier» значение Public.

var <Variable Name> = Properties.Resources.<Resource Name>
23 голосов
/ 13 августа 2013

При условии, что файл .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" на имя вашего строкового ресурса.
15 голосов
/ 13 октября 2014

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

    var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
    string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));
9 голосов
/ 27 апреля 2015

Если по какой-то причине вы не можете поместить свои файлы ресурсов в 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 "";
   }
8 голосов
/ 17 февраля 2016

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

6 голосов
/ 03 октября 2014

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

5 голосов
/ 23 июля 2015

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

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

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

...