asp.net Получить все ресурсы из .resx без указания культуры (ResourceManager.GetResourceSet)

Впервые я столкнулся с вопросом, похожим на мой здесь, при переполнении стека: Прокрутите все ресурсы в ResourceManager - C #. Это решило только часть того, что мне нужно было сделать. Когда вы запрашиваете запись в файле ресурсов для определенной культуры, если ее нет, по умолчанию возвращается файл ресурсов нейтральной культуры.

Мне нужно перебрать каждую запись для данного файла ресурсов, а GetResourceSet требует культуры. Например, у меня есть нейтральный файл ресурсов с 3 записями в нем и файл ресурсов для конкретной культуры, сопровождающий нейтральный файл с 1 записью.

Мой файл с нейтральным примером ресурса - MyResource.resx, а файл примера ресурса для конкретной культуры - MyResource.en-gb.resx. Следующий код показывает, как я сейчас пытаюсь пройти и получить доступ ко всем записям ресурсов.

Dim cultInfo as New CultureInfo(culture)
For Each entry As System.Collections.DictionaryEntry In myResourceManager.GetResourceSet(cultInfo, True, True)

Next

Нейтральные записи файла ресурсов

  • FullName / полное имя
  • PhoneNumber / Номер телефона
  • Штат / Штат

Запись файла ресурсов для конкретной культуры

  • Штат / Страна

Когда я вызываю GetResourceSet для конкретной культуры, я получаю только 1 запись. Я ожидал (и хотел) вернуть все 3 записи с переопределенной записью для одной культуры. Вот что я хочу вернуть:

  • FullName / полное имя
  • PhoneNumber / Номер телефона
  • Штат / Округ

Как я могу это сделать? Спасибо.


person Jason    schedule 25.04.2011    source источник


Ответы (1)


Метод GetString объекта ResourceManager правильно обрабатывает обход файлов ресурсов, чтобы найти правильное значение для данного ключа на основе языка и региональных параметров. Базовый / нейтральный / стандартный файл ресурсов можно получить с помощью CultureInfo.InvariantCulture, который дает вам все возможные ключи для файла ресурсов (при условии, что вы настроили файлы ресурсов таким образом).

Зациклившись на объектах DictionaryEntry, найденных в методе GetResourceSet объекта ResourceManager, на основе инвариантной культуры, а затем вызывая GetString для каждого ключа с использованием определенного переданного языка и региональных параметров, вы получите правильное значение для данного ключа на основе языка и региональных параметров.

For Each entry As DictionaryEntry In myResourceManager.GetResourceSet(CultureInfo.InvariantCulture, True, True)
     Dim strKey as String = entry.Key.ToString()
     Dim strValue as String = myResourceManager.GetString(entry.Key.ToString(), cultInfo)
Next

Надеюсь это поможет!

person Jason    schedule 27.04.2011
comment
Я понимаю, что этот обходной путь решает проблему, но все же обнаруженное вами (и я тоже) поведение этого GetResourceSet метода не отражает то, что находится в документация. - person superjos; 22.08.2013
comment
Ну, вообще-то попробовал, и в моем случае это не решает проблему. При повторении набора ресурсов я получаю только ключи, зависящие от локали. В наборе вообще нет ключа от резервного ресурса. :( И я перепроверил, что передаю правильную культуру, правда, правда. - person superjos; 22.08.2013
comment
В конце концов, мне это удалось так: я создал словарь из InvariantCulture, а другой - из CurrentUICulture, затем я объединил последний с первым. - person superjos; 23.08.2013