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

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

У меня есть отдельный проект, содержащий файлы ресурсов, на которые ссылается мой проект, названный так:  • Resources.resx • Resources.es-ES.resx

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

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

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

У меня есть 2 проекта, где проект YeagerTech - проект веб-приложений, а проект YeagerTechResources - это проект (в том же решении), который содержит все ресурсы. Проект YeagerTech имеет ссылку на него в YeagerTechResources.

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

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

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

Файлы ресурсов в проекте YeagerTechResources имеют свой набор BuildAction для Embedded Resource.

Название моих файлов ресурсов: Resource.resx и Resources.es-ES.resx.

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

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

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

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

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

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

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

У меня есть одно решение и два проекта. Один из них - веб-проект, а другой - проект ресурсов. Проект ресурсов содержится в качестве ссылки в веб-проекте.

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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

MyLocalisation.Properties.Resources.resources

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

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

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

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

Ответ 3

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

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

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

Ответ 4

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

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

Ответ 5

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

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