【发布时间】:2010-12-03 06:35:15
【问题描述】:
如何在 C# 中从 .resx 文件中读取字符串?请给我发送指南。循序渐进
【问题讨论】:
如何在 C# 中从 .resx 文件中读取字符串?请给我发送指南。循序渐进
【问题讨论】:
2.return Resource.ResponseMsgSuccess;
【讨论】:
这对我有用。 假设您有一个 strings.resx 文件,其中包含 ok 字符串。阅读它
String varOk = My.Resources.strings.ok
【讨论】:
ResourceManager 不应该是必需的,除非您从 外部 资源加载。
对于大多数事情,假设您创建了一个项目(DLL、WinForms 等),您只需使用项目名称空间、“资源”和资源标识符。例如:
假设一个项目命名空间:UberSoft.WidgetPro
你的 resx 包含:
你可以使用:
Ubersoft.WidgetPro.Properties.Resources.RESPONSE_SEARCH_WILFRED
【讨论】:
创建资源管理器来检索资源。
ResourceManager rm = new ResourceManager("param1",Assembly.GetExecutingAssembly());
String str = rm.GetString("param2");
param1 = "AssemblyName.ResourceFolderName.ResourceFileName"
param2 = 要从资源文件中检索的字符串的名称
【讨论】:
将资源(名称:ResourceName 和值:ResourceValue)添加到解决方案/程序集后,您可以简单地使用“Properties.Resources.ResourceName”来获取所需的资源。
【讨论】:
我直接将我的资源文件添加到我的项目中,因此我可以使用 resx 文件名访问其中的字符串。
示例:在 Resource1.resx 中,键“resourceKey”-> 字符串“dataString”。 要获取字符串“dataString”,我只需输入 Resource1.resourceKey。
可能有我不知道的不这样做的原因,但它对我有用。
【讨论】:
假设 .resx 文件是使用 Visual Studio 在项目属性下添加的,则访问字符串的方法更简单且不易出错。
然后访问字符串就像这样简单:
var resourceManager = JoshCodes.Core.Testing.Unit.Properties.Resources.ResourceManager;
var exampleXmlString = resourceManager.GetString("exampleXml");
将JoshCodes.Core.Testing.Unit 替换为项目的默认命名空间。
【讨论】:
如果由于某种原因您不能将资源文件放在 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。
在@JeffH 回答之后,我建议使用typeof() 而不是字符串程序集名称。
var rm = new ResourceManager(typeof(YourAssembly.Properties.Resources));
string message = rm.GetString("NameOfKey", CultureInfo.CreateSpecificCulture("ja-JP"));
【讨论】:
我通过 Visual Studio 添加了 .resx 文件。这创建了一个带有属性的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 是通过Visual Studio 创建的Errors.resx 文件,MyErrorMessage 是键。
【讨论】:
试试这个,对我有用..简单
假设你的资源文件名为“TestResource.resx”,然后你想动态传递key,
string resVal = TestResource.ResourceManager.GetString(dynamicKeyVal);
添加命名空间
using System.Resources;
【讨论】:
ResourceManager。请改用<Namespace>.Properties。
最简单的方法是:
【讨论】:
打开 .resx 文件并将“访问修饰符”设置为公开。
var <Variable Name> = Properties.Resources.<Resource Name>
【讨论】:
这个例子来自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");
【讨论】:
ResourceManager。请改用<Namespace>.Properties。