Инициализировать ResourceManager динамически

У меня есть эта функция, и она отлично работает, чтобы получить переведенное значение из этого конкретного файла ресурсов, называемого OkayMessages.

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

Но у меня есть более одного файла ресурсов, и я хочу, чтобы эта функция также получала значения из этих файлов. Только у меня возникают проблемы с динамическим/программным выбором нужного ресурса (менеджера). Я попытался использовать приведенный ниже код и некоторые варианты, но я всегда получаю сообщение об ошибке.

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.

Ответ 1

После поиска в неправильном направлении некоторое время я нашел самый простой ответ на эту проблему. Оказывается, существует метод под названием GetGlobalResourceObject.

Итак, в моем случае я сейчас использую эту строку кода, которая делает все:

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

Ответ 2

Внимательно прочитайте эту статью , и вы обнаружите, что вам нужно указать правильное пространство имен ресурса. Это ваша проблема. Вот рабочий пример, если 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);
        }
    }
}

Если вы поместите свой файл ресурсов в папку "Ресурсы", вам придется обновить пространство имен ресурсов:

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