Câu hỏi đọc chuỗi từ tệp .resx trong C #


Làm thế nào để đọc chuỗi từ tập tin .resx trong c #? xin vui lòng gửi cho tôi hướng dẫn. từng bước một


75
2017-10-02 09:29


gốc


Hãy xem điều này liên kết, nó sẽ giúp. - Adriaan Stander
tại sao? nếu họ không hài lòng với tôi về câu hỏi của tôi, thì tại sao tôi phải chấp nhận những lời đề nghị sai? - Red Swan
Nếu tệp .resx được thêm bằng cách sử dụng Visual Studio trong thuộc tính dự án, hãy xem câu trả lời của tôi để dễ dàng và ít bị lỗi hơn khi truy cập chuỗi. - Joshcodes


Các câu trả lời:


Ví dụ này là từ Trang MSDN trên 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");

70
2017-10-15 16:07



"Các mục" trong mã của bạn là gì?
Từ trang MSDN tôi tham chiếu: baseName Tên gốc của tệp tài nguyên không có phần mở rộng của nó nhưng bao gồm bất kỳ tên vùng tên đầy đủ nào. Ví dụ: tên gốc của tệp tài nguyên có tên MyApplication.MyResource.en-US.resources là MyApplication.MyResource. - JeffH
items == không gian tên của tệp tài nguyên - Diogo
ví dụ kém: bạn nên giải thích rằng các mục là không gian tên + loại gốc của tài nguyên - ActiveX
Câu trả lời của @ nathanchere phải là câu trả lời được chấp nhận - Guillaume RAYMOND


Trình quản lý tài nguyên không cần thiết trừ khi bạn đang tải từ một tài nguyên bên ngoài. Đối với hầu hết mọi thứ, nói rằng bạn đã tạo ra một dự án (DLL, WinForms, bất cứ điều gì), bạn chỉ cần sử dụng không gian tên dự án, "Tài nguyên" và mã định danh tài nguyên. ví dụ:

Giả sử không gian tên dự án: UberSoft.WidgetPro

Và resx của bạn chứa:

resx content example

Bạn chỉ có thể sử dụng:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

68
2017-12-10 22:04





Hãy thử điều này, làm việc cho tôi .. đơn giản

Giả sử rằng tên tệp tài nguyên của bạn là "TestResource.resx" và sau đó bạn muốn truyền chìa khóa,

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

Thêm không gian tên

using System.Resources;

40
2018-03-19 00:48





Mở tệp .resx và đặt "Công cụ sửa đổi truy cập" thành Công khai.

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

24
2017-07-16 20:50



hiện phương pháp này làm việc với nhiều tài nguyên tập tin (ngôn ngữ), gây ra mọi nơi tôi nhìn họ sử dụng phương pháp ResourceManager, và tôi tự hỏi nếu tôi nên mạo hiểm bằng cách này, hay không ... - deadManN


Giả sử tệp .resx đã được thêm bằng cách sử dụng Visual Studio trong thuộc tính dự án, có một cách dễ dàng hơn và ít bị lỗi hơn khi truy cập chuỗi.

  1. Mở rộng tệp .resx trong Solution Explorer sẽ hiển thị tệp .Designer.cs.
  2. Khi được mở, tệp .Designer.cs có một vùng tên thuộc tính và một lớp nội bộ. Ví dụ này giả sử lớp được đặt tên là Tài nguyên.
  3. Truy cập chuỗi sau đó dễ dàng như:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
    
  4. Thay thế JoshCodes.Core.Testing.Unit với không gian tên mặc định của dự án.

  5. Thay thế "exampleXml" bằng tên của tài nguyên chuỗi của bạn.

20
2017-08-13 16:38



Nó làm việc cho tôi, cảm ơn - yu yang Jian
Rất hữu ích. Cảm ơn. - ejmin
1000x tốt hơn so với hầu hết các giải pháp, cảm ơn! - spadelives


Tiếp theo là câu trả lời của @JeffH, tôi khuyên bạn nên sử dụng typeof() so với tên lắp ráp chuỗi.

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

13
2017-10-13 13:28





Nếu vì một số lý do bạn không thể đặt các tệp tài nguyên của mình trong App_GlobalResources, thì bạn có thể mở tệp tài nguyên trực tiếp bằng cách sử dụng ResXResourceReader hoặc Trình đọc XML.

Đây là mã mẫu để sử dụng 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
2018-04-27 09:15



Cảm ơn, lưu ý rằng bạn phải thêm tham chiếu vào System.Windows.Forms sử dụng System.Resources.ResXResourceReader. Ngoài ra, bạn có thể làm var enumerator = rsxr.OfType<DictionaryEntry>(); và sử dụng LINQ thay thế. - Dunc
Rất khó để tìm các bài viết hoặc bài viết về cách "đọc, phân tích cú pháp và tải" một tệp resx. Tất cả những gì bạn nhận được là "sử dụng resx làm vùng chứa cho chuỗi của dự án của bạn". Cảm ơn bạn vì câu trả lời này! - Simone


Khi bạn thêm một tài nguyên (Name: ResourceName và Value: ResourceValue) vào giải pháp / assembly, bạn có thể chỉ cần sử dụng "Properties.Resources.ResourceName" để lấy tài nguyên được yêu cầu.


7
2018-02-17 12:52





Tôi đã thêm tệp .resx qua Visual Studio. Điều này tạo ra một designer.cs tập tin với các thuộc tính để ngay lập tức trả về giá trị của bất kỳ khóa nào tôi muốn. Ví dụ, đây là một số mã được tạo tự động từ tệp thiết kế.

/// <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);
    }
}

Bằng cách đó, tôi đã có thể chỉ đơn giản là làm:

string message = Errors.MyErrorMessage;

Ở đâu Errors là Errors.resx tệp được tạo thông qua Visual Studio và MyErrorMessage là chìa khóa.


5
2017-10-03 18:23



Yup tôi chỉ làm điều này là VS2015 ngày hôm nay. Nhấp chuột phải, thêm "Tài nguyên" tập tin, và bất kỳ phím trở thành "dottable". Vì vậy, "MyResx.resx" với một phím "Script" có thể được truy cập như chuỗi scriptValue = MyResx.Script; - emery.noel