【问题标题】:Initialize ResourceManager dynamically动态初始化 ResourceManager
【发布时间】:2012-06-26 05:29:44
【问题描述】:

我有这个函数,它可以很好地从这个名为 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。

【问题讨论】:

  • 所以这里的根本问题是 App_GlobalResources 文件夹中的资源被编译到它们自己的程序集 (App_GlobalResources) 中。 GetGlobalResourceObject 方法知道使用正确的程序集。

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


【解决方案1】:

在错误的方向搜索了一段时间后,我才找到了这个问题的最简单的答案。原来有一个方法叫GetGlobalResourceObject

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

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

【讨论】:

  • 您是否能够使用名为 Resources.OkayMessages 的文件来执行此操作(就像您的原始示例所暗示的那样),或者您是否将其命名为“OkayMessages”?为了让它工作,我必须在文件名中没有句点,因为它一直认为句点是本地化的操作点。
【解决方案2】:

仔细阅读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;

【讨论】:

  • 我仍然遇到同样的错误。我正在使用 \App_GlobalResources\ 文件夹,因此,我的资源文件位于命名空间 Resources 中。那会有什么不同吗?
  • 在我的代码的其他部分,我通常调用这样的资源字符串 Resources.OkayMessages.UserLoggedIn
  • 在试用了您的解决方案后,我用一些发现更新了我的问题。问题似乎是使用 \App_GlobalResources\ 文件夹。
  • App_GlobalResources 本身不是问题。您必须更新命名空间。在您的情况下,它将是YourDefaultNamespace.App_GlobalResources.FileName。所以,我相信我的回答是正确的。
  • 我刚试过这个,还有一些变化,但仍然是同样的错误。好消息是,它确实让我在一些不同的方向上搜索,我找到了解决方案。我会为它写一个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2011-01-02
相关资源
最近更新 更多