Использование 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.