จะอ่านสตริงจากไฟล์. resx ใน c # ได้อย่างไร โปรดส่งแนวทางให้ฉัน เป็นขั้นเป็นตอน
จะอ่านสตริงจากไฟล์. resx ใน c # ได้อย่างไร โปรดส่งแนวทางให้ฉัน เป็นขั้นเป็นตอน
คำตอบ:
ตัวอย่างนี้มาจากเพจ 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");
ResourceManager
เมื่อคุณต้องการโหลดทรัพยากรภายนอก ใช้<Namespace>.Properties
แทน
ResourceManager
ไม่จำเป็นต้องใช้เว้นแต่คุณจะโหลดจากทรัพยากรภายนอก
โดยทั่วไปแล้วสมมติว่าคุณได้สร้างโครงการ (DLL, WinForms อะไรก็ได้) คุณเพียงแค่ใช้เนมสเปซโครงการ "ทรัพยากร" และตัวระบุทรัพยากร เช่น:
สมมติว่าเนมสเปซโปรเจ็กต์: UberSoft.WidgetPro
และ resx ของคุณประกอบด้วย:
คุณสามารถใช้:
Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
ลองนี้ได้ผลสำหรับฉัน .. ง่ายๆ
สมมติว่าชื่อไฟล์ทรัพยากรของคุณคือ "TestResource.resx" และคุณต้องการส่งคีย์แบบไดนามิกจากนั้น
string resVal = TestResource.ResourceManager.GetString(dynamicKeyVal);
เพิ่มเนมสเปซ
using System.Resources;
ResourceManager
เมื่อคุณต้องการโหลดทรัพยากรภายนอก ใช้<Namespace>.Properties
แทน
เปิดไฟล์. resx และตั้งค่า "Access Modifier" เป็นสาธารณะ
var <Variable Name> = Properties.Resources.<Resource Name>
สมมติว่ามีการเพิ่มไฟล์. resx โดยใช้ Visual Studio ภายใต้คุณสมบัติของโปรเจ็กต์มีวิธีที่ง่ายกว่าและมีข้อผิดพลาดน้อยกว่าในการเข้าถึงสตริง
การเข้าถึงสตริงนั้นง่ายพอ ๆ กับ:
var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
var exampleXmlString = resourceManager.GetString("exampleXml");
แทนที่JoshCodes.Core.Testing.Unit
ด้วยเนมสเปซเริ่มต้นของโปรเจ็กต์
ตามด้วยคำตอบ @JeffH ฉันแนะนำให้ใช้typeof()
มากกว่าชื่อแอสเซมบลีสตริง
var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));
หากด้วยเหตุผลบางประการคุณไม่สามารถใส่ไฟล์ทรัพยากรใน 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 แทน
เมื่อคุณเพิ่มทรัพยากร (ชื่อ: ResourceName และค่า: ResourceValue) ไปยังโซลูชัน / แอสเซมบลีคุณสามารถใช้ "Properties.Resources.ResourceName" เพื่อรับทรัพยากรที่ต้องการ
ฉันเพิ่มไฟล์. 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
เป็นกุญแจสำคัญ
ฉันเพิ่มไฟล์ทรัพยากรลงในโปรเจ็กต์ของฉันโดยตรงดังนั้นฉันจึงสามารถเข้าถึงสตริงภายในได้โดยใช้ชื่อไฟล์ resx
ตัวอย่าง: ใน Resource1.resx คีย์ "resourceKey" -> string "dataString" ในการรับสตริง "dataString" ฉันแค่ใส่ Resource1.resourceKey
อาจมีเหตุผลที่จะไม่ทำสิ่งนี้ที่ฉันไม่รู้ แต่มันได้ผลสำหรับฉัน
วิธีที่ง่ายที่สุดคือ:
วิธีที่ง่ายที่สุดในการรับค่าจากไฟล์ทรัพยากร เพิ่มไฟล์ทรัพยากรในโครงการ ตอนนี้รับสตริงที่คุณต้องการเพิ่มเช่นในกรณีของฉันมันคือบล็อกข้อความ (SilverLight) ไม่จำเป็นต้องเพิ่มเนมสเปซใด ๆ ด้วยมันใช้งานได้ดีในกรณีของฉัน
txtStatus.Text = Constants.RefractionUpdateMessage;
สร้างตัวจัดการทรัพยากรเพื่อดึงทรัพยากร
ResourceManager rm = new ResourceManager("param1",Assembly.GetExecutingAssembly());
String str = rm.GetString("param2");
param1 = "AssemblyName.ResourceFolderName.ResourceFileName"
param2 = ชื่อของสตริงที่จะดึงจากไฟล์ทรัพยากร
สิ่งนี้ใช้ได้กับฉัน บอกว่าคุณมีไฟล์ strings.resx ที่มีสตริงตกลงอยู่ เพื่ออ่าน
String varOk = My.Resources.strings.ok