动态初始化ResourceManager

时间:2012-06-24 21:10:05

标签: asp.net .net resx resource-files

我有这个功能,它可以从这个名为 OkayMessages 的特定资源文件中获取翻译后的值。

public static string GetResourceString(string resourceKey){
  ResourceManager resourceManager = Resources.OkayMessages.ResourceManager;
  return resourceManager.GetString(resourceKey);
}

但是我有超过1个资源文件,我希望这个函数也能从这些文件中获取值..只是,我在动态/编程选择正确的资源(管理器)时遇到了麻烦。 我试图使用下面的代码,以及一些变体,但我总是得到一个错误。

public static string GetResourceString(string resourceFile, string resourceKey){
  ResourceManager resourceManager = new System.Resources.ResourceManager("Resources." + resourceFile, Assembly.GetExecutingAssembly());
  return resourceManager.GetString(resourceKey);
}

我大部分时间犯的错误是:找不到适合指定文化或中性文化的资源。确保“Resources.OkayMessages.resources”已正确嵌入或链接到程序集..

更新:我正在使用\ App_GlobalResources \文件夹作为我的资源文件,似乎这就是问题所在。当我将资源文件放在项目的根目录中时,我可以毫无问题地初始化ResourceManager。

2 个答案:

答案 0 :(得分:5)

在错误的方向搜索一段时间之后,我找到了解决这个问题的最简单的答案。事实证明,有一种名为GetGlobalResourceObject的方法。

所以在我的情况下,我现在正在使用这行代码完成所有工作:

GetGlobalResourceObject("OkayMessages", "PasswordChanged").ToString();

答案 1 :(得分:1)

仔细阅读此article,您会发现需要指定资源的正确名称空间。那是你的问题。如果OkayResources.resx位于项目根文件夹中,这是一个工作示例:

using System.Reflection;
using System.Resources;
using System.Web.UI;

namespace WebApplication1
{
    public partial class _Default : Page
    {

        public _Default()
        {
            var result = GetResourceString("OkayResources", "SomeKey");
        }

        private static string GetResourceString(string resourceFileName, string key)
        {
            var resourceName = "WebApplication1." + resourceFileName;
            var resourceManager = new ResourceManager(resourceName, Assembly.GetExecutingAssembly());
            return resourceManager.GetString(key);
        }
    }
}

如果将资源文件放入Resources文件夹,则必须更新资源名称空间:

var resourceName = "WebApplication1.Resources." + resourceFileName;