Использование ResourceManager

Я пытаюсь использовать ResourceManager в классе C#, но не знаю, что заменить базовое имя при создании нового экземпляра класса ResourceManager.

У меня есть отдельный проект, который содержит файлы ресурсов, на которые ссылается мой проект, названный ниже:

  • Resources.resx
  • Resources.es-ES.resx

Если у меня есть следующий фрагмент кода, что мне следует заменить базовым именем, если я хочу использовать английскую или испанскую версию ресурсов?

ResourceManager RM = new ResourceManager(basename,Assembly.GetExecutingAssembly());

Я попробовал подход, предложенный Томом, но получаю печально известную ошибку

Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры.

Мое решение имеет два проекта, где проект YeagerTech является веб-приложением, а проект YeagerTechResources содержит все ресурсы. Проект YeagerTech имеет ссылку на YeagerTechResources.

У меня следующий синтаксис при создании диспетчера ресурсов:

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources",
    Assembly.GetExecutingAssembly());

Очевидно, это неверно.

В файлах ресурсов в проекте YeagerTechResources для BuildAction установлено значение "Встроенный ресурс".

Имя моих файлов ресурсов: Resources.resx и Resources.es-ES.resx.

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

Я сделал все, что мог придумать, чтобы решить эту проблему и не могу....

Это моя последняя попытка решить эту проблему здесь...

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources", Assembly.GetExecutingAssembly());

sb.Append(RM.GetString("RegisterThanks"));

Я получаю следующую ошибку после выполнения кода выше:

Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что "YeagerTechResources.Resources.resources" был правильно встроен или связан со сборкой "YeagerTech" во время компиляции, или что все требуемые сателлитные сборки являются загружаемыми и полностью подписаны.

Я могу использовать ресурсы в разметке HTML без каких-либо проблем, но при переходе к коду C# в контроллере я продолжаю получать вышеуказанную ошибку.

Любая помощь для точного синтаксиса мне нужно на основе моих проектов будет принята с благодарностью.

6 ответов

Есть удивительно простой способ чтения ресурса по строке:

ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")

Это чистое и элегантное решение для чтения ресурсов по ключам, где нельзя использовать "точечную нотацию" (например, когда ключ ресурса сохраняется в базе данных).

Быстрый и грязный способ проверить, какая строка вам нужна, чтобы посмотреть на сгенерированные файлы.resources.

Ваши.resources генерируются в каталоге ресурсов проектов obj/Debug. (если нет, щелкните правой кнопкой мыши файл.resx в обозревателе решений и нажмите "Запустить пользовательский инструмент", чтобы создать файлы.resources).

Перейдите в этот каталог и посмотрите на имена файлов. Вы должны увидеть файл, оканчивающийся на XYZ.resources. Скопируйте это имя файла и удалите конечные.resources, и это файл, который вы должны загрузить.

Например, в моем каталоге obj/Bin у меня есть файл:

MyLocalisation.Properties.Resources.resources

Если файлы ресурсов находятся в одной библиотеке классов / приложении, я бы использовал следующий C#

ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", Assembly.GetExecutingAssembly());

Однако, похоже, что вы используете файл ресурсов из отдельной библиотеки классов / приложения, которое вы, вероятно, хотите

Assembly localisationAssembly = Assembly.Load("MyLocalisation");
ResourceManager RM =  new ResourceManager("MyLocalisation.Properties.Resources", localisationAssembly);

Этот SO ответ может помочь в этом случае.
Если основной проект уже ссылается на проект ресурса, то вы можете просто явно работать со своим сгенерированным классом ресурса в своем коде и получить доступ к его ResourceManager От этого. Следовательно, что-то вроде:

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

// then, you could go on working with that
ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
// ...

В соответствии с документацией MSDN, приведенной здесь, аргумент "Базовое имя" указывает "Корневое имя файла ресурса без его расширения, но включает в себя любое полное имя пространства имен. Например, корневое имя файла ресурса с именем"MyApplication.MyResource.en-US. ресурсы "является" MyApplication.MyResource "."

ResourceManager автоматически попытается получить значения для текущей культуры пользовательского интерфейса. Если вы хотите использовать определенный язык, вам нужно будет установить текущую культуру пользовательского интерфейса на язык, который вы хотите использовать.

В принципе это та же идея, что и @Landeeyos. во всяком случае, развивая этот ответ: немного опоздал на вечеринку, но вот мои два цента:

сценарий:

У меня есть уникальный случай добавления некоторых (примерно 28 текстовых файлов) предопределенных файлов шаблонов с моим приложением WPF. Таким образом, идея заключается в том, что каждый раз, когда это приложение должно быть установлено, эти текстовые файлы шаблона будут легко доступны для использования. во всяком случае, я сделал отдельную библиотеку для хранения файлов, добавив resource.resx. Затем я добавил все эти файлы в этот файл ресурсов (если дважды щелкнуть файл.resx, его дизайнер откроется в Visual Studio). Я установил модификатор доступа для всех. Кроме того, каждый файл был помечен как встроенный ресурс с помощью действия "Построение" каждого текстового файла (это можно узнать, просмотрев его свойства). Давайте назовем это bibliothek1.dll. Я ссылался на эту библиотеку (bibliothek1.dll), приведенную выше, в другой библиотеке (назовите ее bibliothek2.dll), а затем использовал эту вторую библиотеку в приложении mf wpf.

актуальное веселье:

        // embedded resource file name <i>with out extension</i>(this is vital!) 

        string fileWithoutExt = Path.GetFileNameWithoutExtension(fileName);

        // is required in the next step

        // without specifying the culture
        string wildFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt);
        Console.Write(wildFile);

        // with culture
        string culturedFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt, CultureInfo.InvariantCulture);
        Console.Write(culturedFile);

пример: оформление заказа 'testingresourcefilesusage' @ https://github.com/Natsikap/samples.git

Я надеюсь, что это поможет кому-нибудь, когда-нибудь, где-нибудь!

Я прошел через аналогичную проблему. Если вы считаете свой "YeagerTechResources.Resources", это означает, что ваш Resources.resx находится в корневой папке вашего проекта.

Будьте внимательны, указав полный путь, например: "project\subfolder(s)\file[.resx]", к конструктору ResourceManager.

Другие вопросы по тегам