อ่านสตริงจากไฟล์. resx ใน C #


100

จะอ่านสตริงจากไฟล์. resx ใน c # ได้อย่างไร โปรดส่งแนวทางให้ฉัน เป็นขั้นเป็นตอน


ลองดูลิงค์นี้น่าจะช่วยได้
Adriaan Stander

15
ทำไมถ้าพวกเขาไม่พอใจฉันในคำถามของฉันทำไมฉันต้องยอมรับข้อเสนอแนะที่ผิด
หงส์แดง

1
ถ้าไฟล์. resx ถูกเพิ่มโดยใช้ Visual Studio ภายใต้คุณสมบัติของโปรเจ็กต์โปรดดูคำตอบของฉันสำหรับวิธีที่ง่ายขึ้นและมีข้อผิดพลาดน้อยกว่าในการเข้าถึงสตริง
Joshcodes

คำตอบ:


74

ตัวอย่างนี้มาจากเพจ 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 == เนมสเปซของไฟล์ทรัพยากร

9
ตัวอย่างที่ไม่ดี: คุณควรอธิบายว่ารายการเป็นเนมสเปซ + ประเภทรูทของทรัพยากร
ActiveX

คุณต้องการเฉพาะResourceManagerเมื่อคุณต้องการโหลดทรัพยากรภายนอก ใช้<Namespace>.Propertiesแทน
Yousha Aleayoub

132

ResourceManagerไม่จำเป็นต้องใช้เว้นแต่คุณจะโหลดจากทรัพยากรภายนอก
โดยทั่วไปแล้วสมมติว่าคุณได้สร้างโครงการ (DLL, WinForms อะไรก็ได้) คุณเพียงแค่ใช้เนมสเปซโครงการ "ทรัพยากร" และตัวระบุทรัพยากร เช่น:

สมมติว่าเนมสเปซโปรเจ็กต์: UberSoft.WidgetPro

และ resx ของคุณประกอบด้วย:

ตัวอย่างเนื้อหา resx

คุณสามารถใช้:

Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED

4
ขอบคุณมากสำหรับคำตอบนี้
Vaishali

1
ขอบคุณควรทำเครื่องหมายว่าเป็นคำตอบ ชัดเจนและสะอาดกว่า "คำตอบ" ของคำถามนี้มาก
Jeroen Jonkman

ไม่มีประเภทหรือเนมสเปซ
Paul McCarthy

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

30

เปิดไฟล์. resx และตั้งค่า "Access Modifier" เป็นสาธารณะ

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

3
วิธีนี้ใช้ได้กับไฟล์ทรัพยากรหลายไฟล์ (ภาษา) ทำให้ทุกที่ที่ฉันมองพวกเขาใช้ ResourceManager Method และฉันสงสัยว่าฉันควรเสี่ยงใช้วิธีนี้หรือไม่ ...
deadManN

2
ไม่สำเร็จ. ไฟล์ทรัพยากรของฉันไม่แสดงหลังจาก Properties.Resources "ชื่อไฟล์ของฉัน" แม้ว่าจะตั้งค่าเป็นสาธารณะ
user1804084

28

สมมติว่ามีการเพิ่มไฟล์. resx โดยใช้ Visual Studio ภายใต้คุณสมบัติของโปรเจ็กต์มีวิธีที่ง่ายกว่าและมีข้อผิดพลาดน้อยกว่าในการเข้าถึงสตริง

  1. การขยายไฟล์. resx ใน Solution Explorer ควรแสดงไฟล์. Designer.cs
  2. เมื่อเปิดไฟล์. Designer.cs จะมี Properties namespace และคลาสภายใน สำหรับตัวอย่างนี้สมมติว่าคลาสนี้มีชื่อว่า 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

17

ตามด้วยคำตอบ @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 แทน
Dunc

เป็นเรื่องยากมากที่จะหาบทความหรือโพสต์เกี่ยวกับวิธี "อ่านแยกวิเคราะห์และโหลด" ไฟล์ resx สิ่งที่คุณได้รับคือ "ใช้ resx เป็นคอนเทนเนอร์สำหรับสตริงของโครงการของคุณ" ขอบคุณสำหรับคำตอบนี้!
Simone

9

เมื่อคุณเพิ่มทรัพยากร (ชื่อ: ResourceName และค่า: 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 วันนี้ คลิกขวาเพิ่มไฟล์ "ทรัพยากร" และคีย์ใด ๆ จะกลายเป็น "dottable" ดังนั้น "MyResx.resx" ที่มีคีย์ "Script" จึงสามารถเข้าถึงได้เช่น string scriptValue = MyResx.Script;
Emery.noel

5

ฉันเพิ่มไฟล์ทรัพยากรลงในโปรเจ็กต์ของฉันโดยตรงดังนั้นฉันจึงสามารถเข้าถึงสตริงภายในได้โดยใช้ชื่อไฟล์ resx

ตัวอย่าง: ใน Resource1.resx คีย์ "resourceKey" -> string "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 = ชื่อของสตริงที่จะดึงจากไฟล์ทรัพยากร


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.