2009-10-02 60 views
70

Cách đọc chuỗi từ tệp .resx trong C#? xin vui lòng gửi cho tôi hướng dẫn. từng bướcđọc chuỗi từ tệp .resx trong C#

+14

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 các đề xuất sai? –

+1

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] (http://stackoverflow.com/questions/1508570/read-string-from-resx-file-in-c-sharp/ 18214592 # 18214592) để dễ dàng và ít bị lỗi hơn khi truy cập chuỗi. – Joshcodes

+0

Hãy xem [this] (http://snipplr.com/view/2140/csharp-reading-string-from-resource-file------------------ - /) liên kết, nó sẽ giúp. –

Trả lời

66

Ví dụ này là từ MSDN page on 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"); 
+9

"Mục" trong mã của bạn là gì? –

+3

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 không gian 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

+1

items == không gian tên của tệp tài nguyên –

21

mở file resx và thiết lập "Truy cập Modifier" để Công.

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

hiện phương pháp này hoạt động với nhiều tệp tài nguyên (ngôn ngữ), khiến mọi nơi tôi nhìn chúng sử dụng phương pháp ResourceManager, và tôi tự hỏi liệu tôi có nên mạo hiểm khi sử dụng cách này hay không ... – deadManN

61

Trình quản lý tài nguyên không cần thiết trừ khi bạn tải từ tài nguyên bên ngoài. Đối với hầu hết mọi thứ, giả sử bạn đã tạo 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ử một không gian tên dự án: UberSoft.WidgetPro

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

resx content example

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

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED 

Một số tài liệu về vấn đề này là ở MSDN: How to: Retrieve Resource Values Programmatically.

19

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 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 không gian 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. Tiếp cận chuỗi là sau đó dễ dàng như:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager; 
    var exampleXmlString = resourceManager.GetString("exampleXml"); 
    
  4. Thay JoshCodes.Core.Testing.Unit với namespace 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.
+1

Nó hoạt động cho tôi, cảm ơn –

+1

Rất hữu ích. Cảm ơn. – ejmin

2

Cách dễ nhất để làm điều này là:

  1. Tạo một thư mục hệ thống App_GlobalResources và thêm một tập tin tài nguyên để nó ví dụ Messages.resx
  2. Tạo các mục nhập của bạn trong tệp tài nguyên, ví dụ: ErrorMsg = Đây là lỗi.
  3. Sau đó, để truy cập vào đó: string ERRORMSG = Resources.Messages.ErrorMsg
38

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

Giả sử rằng tên file nguồn của bạn là "TestResource.resx", và bạn muốn vượt qua chính tự động sau đó,

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

Thêm Namespace

using System.Resources; 
5

tôi đã thêm các file resx qua Visual Studio. Điều này tạo ra một tập tin designer.cs với tính ngay lập tức trả về giá trị .. của bất kỳ phím nào tôi muốn Ví dụ, đây là một số mã tự động tạo ra từ các tập tin 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ỉ cần làm:

string message = Errors.MyErrorMessage; 

Trường hợp ErrorsErrors.resx tệp được tạo thông qua Visual Studio và MyErrorMessage là chìa khóa.

+0

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; –

12

Tiếp theo câu trả lời @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")); 
8

Nếu vì lý do nào đó bạn không thể đặt tệp tài nguyên trong App_GlobalResources, thì bạn có thể mở tệp tài nguyên trực tiếp bằng ResXResourceReader hoặc Trình đọc XML.

Dưới đây là mẫu mã để 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 ""; 
    } 
+0

Cảm ơn, lưu ý rằng bạn phải thêm một tham chiếu đến' System.Windows.Forms' để sử dụng 'System.Resources.ResXResourceReader'. , bạn có thể làm 'var enumerator = rsxr.OfType ();' và sử dụng LINQ thay thế. – Dunc

+0

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. 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 đã trả lời câu trả lời này! – Simone

4

tôi thêm tập tin tài nguyên của tôi để dự án của tôi trực tiếp, và vì vậy tôi đã có thể truy cập vào các dây bên trong chỉ tốt với các tên file resx.

Ví dụ: trong Resource1.resx, khóa "resourceKey" -> string "dataString". Để lấy chuỗi "dataString", tôi chỉ cần đặt Resource1.resourceKey.

Có thể có lý do để không làm điều này mà tôi không biết, nhưng nó có hiệu quả đối với tôi.

6

Khi bạn thêm tài nguyên (Tên: ResourceName và Giá trị: ResourceValue) vào giải pháp/lắp ráp, bạn có thể chỉ cần sử dụng "Properties.Resources.ResourceName" để nhận tài nguyên được yêu cầu.