đọc chuỗi từ tệp .resx trong C #


99

Làm cách nào để đọ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 một


Hãy xem liên kết này , nó sẽ hữu ích.
Adriaan Stander

15
Tại sao? Nếu họ không hài lòng với tôi về những 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 lầm?
Red Swan vào

1
Nếu tệp .resx đã được thêm bằng Visual Studio trong thuộc tính dự án, hãy xem câu trả lời của tôi để biết cách truy cập chuỗi dễ dàng hơn và ít bị lỗi hơn.
Joshcodes

Câu trả lời:


75

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

4
Từ trang MSDN tôi đã tham khảo: baseName Tên gốc của tệp tài nguyên không có phần mở rộng nhưng bao gồm bất kỳ tên không gian tên đủ điều kiện 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

7
Ví dụ người nghèo: bạn nên giải thích mục đó là namespace + loại thư mục gốc của tài nguyên
ActiveX

Bạn chỉ cần ResourceManagerkhi bạn muốn tải một tài nguyên Bên ngoài. Sử dụng <Namespace>.Propertiesthay thế.
Yousha Aleayoub

131

ResourceManagerkhông cần thiết trừ khi bạn đang 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ứ thứ 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 vùng tên dự án: UberSoft.WidgetPro

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

ví dụ về nội dung resx

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

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

4
Cảm ơn rất nhiều cho câu trả lời này.
Vaishali

1
Cảm ơn bạn, điều này sẽ được đánh dấu là một câu trả lời. Rõ ràng và sạch sẽ hơn nhiều so với "câu trả lời" của câu hỏi này.
Jeroen Jonkman

Loại hoặc không gian tên không tồn tại
Paul McCarthy

53

Hãy thử cái này, phù hợp với 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à bạn muốn chuyển khóa động sau đó,

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

Thêm không gian tên

using System.Resources;

Bạn cũng có thể tùy chọn chỉ định Văn hóa - hữu ích nếu bạn muốn đảm bảo đầu ra dành riêng cho văn hóa mâu thuẫn với giá trị mặc định. ví dụ: TestResource.ResourceManager.GetString (mô tả, mới CultureInfo ("en-GB"));
Ian

Tôi gặp lỗi sau: 'Tài nguyên' không chứa định nghĩa cho 'GetString'.
Lechucico

Bạn chỉ cần ResourceManagerkhi bạn muốn tải một tài nguyên Bên ngoài. Sử dụng <Namespace>.Propertiesthay thế.
Yousha Aleayoub

29

Mở tệp .resx và đặt "Access Modifier" thành Công khai.

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

2
không phương pháp này làm việc với nhiều tập tin nguồn (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 liệu tôi nên mạo hiểm sử dụng cách này, hay không ...
deadManN

1
Không hoạt động. Tệp tài nguyên của tôi không được hiển thị sau Properties.Resources. "Tên tệp của tôi" ngay cả khi nó được đặt thành công khai
user1804084

27

Giả sử tệp .resx được thêm bằ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 để truy cập vào chuỗi.

  1. Mở rộng tệp .resx trong Trình khám phá giải pháp sẽ hiển thị tệp .Designer.cs.
  2. Khi được mở, tệp .Designer.cs có không gian tên Thuộc tính và một lớp bên trong. Đối với ví dụ này, giả sử lớp có tên là Tài nguyên.
  3. Sau đó, truy cập chuỗi dễ dàng như sau:

    var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
    var exampleXmlString = resourceManager.GetString("exampleXml");
  4. Thay thế JoshCodes.Core.Testing.Unitbằng 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.

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

16

Tiếp theo là câu trả lời @JeffH, tôi khuyên bạn nên sử dụng typeof()hơn tên tổ hợp chuỗi.

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

10

Nếu vì lý do nào đó, bạn không thể đặt tệp tài nguyên của mình vào 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.

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

Cảm ơn, lưu ý rằng bạn phải thêm một tham chiếu 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 thấy các bài báo hoặc bài đăng 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 các chuỗi dự án của bạn". Cảm ơn bạn vì câu trả lời này!
Simone

9

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ần thiết.


7

Tôi đã thêm tệp .resx qua Visual Studio. Điều này tạo ra một designer.cstệp với các thuộc tính để trả về ngay 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 trình 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ể đơn giản làm:

string message = Errors.MyErrorMessage;

Ở đâu ErrorsErrors.resxtập tin được tạo ra thông qua Visual Studio và MyErrorMessagelà chìa khóa.


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

5

Tôi đã trực tiếp thêm tệp tài nguyên của mình vào dự án của mình và vì vậy tôi có thể truy cập các chuỗi bên trong chỉ với tên tệp resx.

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

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


3

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

  1. Tạo thư mục hệ thống App_GlobalResources và thêm tệp tài nguyên vào đó, 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à một lỗi.
  3. Sau đó, để truy cập mục nhập đó: string errormsg = Resources.Messages.ErrorMsg

2

Cách đơn giản nhất để nhận giá trị từ tệp tài nguyên. Thêm tệp Tài nguyên trong dự án. Bây giờ lấy chuỗi mà bạn muốn thêm vào, giống như trong trường hợp của tôi, đó là khối văn bản (SilverLight). Không cần thêm bất kỳ không gian tên nào. Nó hoạt động tốt trong trường hợp của tôi

txtStatus.Text = Constants.RefractionUpdateMessage;

Hằng số là tên tệp tài nguyên của tôi trong dự án.Đây là cách tệp tài nguyên của tôi trông như thế nào


0

Tạo trình quản lý tài nguyên để truy xuất tài nguyên.

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

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

param1 = "AssemblyName.ResourceFolderName.ResourceFileName"

param2 = tên của chuỗi được truy xuất từ ​​tệp tài nguyên


0

Điều này làm việc cho tôi. nói rằng bạn có một tệp string.resx với chuỗi ok trong đó. đọc nó

String varOk = My.Resources.strings.ok
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.