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

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

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

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

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

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

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

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

В моем решении есть два проекта, в которых проект YeagerTech представляет собой веб-приложение, а проект YeagerTechResources содержит все ресурсы. В Project YeagerTech есть ссылка на YeagerTechResources.

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

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

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

Для файлов ресурсов в проекте YeagerTechResources для BuildAction задано значение Embedded Resource.

Имена моих файлов ресурсов: 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 # в Контроллере, я продолжаю получать указанную выше ошибку.

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


person sagesky36    schedule 11.01.2012    source источник
comment
К вашему сведению, в Visual Studio, если вы добавите новый элемент в свой проект, выберите файл ресурсов и назовите его Resources.resx, тогда Visual Studio автоматически сгенерирует класс-оболочку для класса ResourceManager в файле с именем Resources.Designer.cs. Вы можете посмотреть на этот код, чтобы увидеть, как он работает. К сожалению, класс-оболочка создается как внутренний по отношению к проекту, поэтому вы не сможете увидеть этот класс-оболочку из другого проекта, если не используете атрибут InternalsVisibleTo.   -  person Dr. Wily's Apprentice    schedule 12.01.2012
comment
@ sagesky36 У вас есть как независимый от языка файл resx (один без кода языка), так и файл resx, зависящий от языка (например, Resources.en-US.resx)? Вам нужен хотя бы независимый от языка, и укажите в настройках проекта, какой язык является нейтральным для вашего приложения.   -  person Tom Lint    schedule 10.02.2015
comment
Если вы часто переключаетесь между языками, имеет смысл загрузить менеджеры ресурсов для нескольких языков и иметь их наготове. тогда вы можете переключиться на локаль при поступлении запроса. ------------------------------------- ------------------ переключатель (языковой стандарт) {case fr-CA: return resourceManagerFr.GetString (key, CultureInfo.CreateSpecificCulture (locale)); по умолчанию: return resourceManager.GetString (ключ, CultureInfo.CreateSpecificCulture (locale)); }   -  person    schedule 14.02.2018


Ответы (6)


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

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

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

person Landeeyo    schedule 22.04.2015
comment
Еще проще: добавьте using RootNamespace.Properties в файл кода (где корневое пространство имен определено в свойствах вашего проекта), а затем просто выполните: Resources. ‹ResourceName›. Однако я не уверен, что вы сможете сделать с этим локализацию. - person user169771; 13.05.2015
comment
Что такое ResourceNamespace? Вы можете предоставить полный код? - person Muflix; 19.11.2015
comment
@Muflix Это просто пространство имён файла ресурсов. - person Landeeyo; 19.11.2015
comment
В моем случае мне пришлось добавить к пространству имен префикс ::global. В остальном это отличное решение. - person Rafael Bizarra; 07.03.2018

Быстрый и грязный способ проверить, какая строка вам нужна для просмотра сгенерированных файлов .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);
person SinOB    schedule 09.02.2012

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

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

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

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

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

person Tom Lint    schedule 11.01.2012
comment
Незначительное исправление - ResourceManager не обязательно должен создаваться после изменения текущей культуры пользовательского интерфейса. - person Dr. Wily's Apprentice; 12.01.2012

по сути это та же идея, что и @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);

образец: checkout 'testingresourcefilesusage' @ https://github.com/Natsikap/samples.git

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

person Ada_Spark    schedule 24.10.2018

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

Не забудьте указать полный путь, например: «проект \ подпапки \ файл [.resx]», к конструктору ResourceManager.

person leguminator    schedule 18.04.2016