Инициализируйте ResourceManager динамически

У меня есть эта функция, и она прекрасно работает, чтобы получить переведенное значение из этого конкретного файла ресурсов с именем 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 ответа

Решение

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

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

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

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