Использование ResourceManager - PullRequest
23 голосов
/ 11 января 2012

Я пытаюсь использовать 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 ]

41 голосов
/ 22 апреля 2015

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

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

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

17 голосов
/ 09 февраля 2012

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

Этот ответ 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);
// ...
4 голосов
/ 11 января 2012

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

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

0 голосов
/ 24 октября 2018

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

сценарий:

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

        // 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

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

0 голосов
/ 18 апреля 2016

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

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

...