Менеджер по культурным ресурсам

проблема

Я пытаюсь внедрить систему в моей программе для переключения языка. Я узнал, что я могу использовать CultureInfo и ResourceManager для достижения этой цели. Я создал этот код через пару часов, столкнувшись с проблемой с ресурсом, который не был найден, наконец, я нашел и ответил здесь на stackru, и я организовал следующий код:

CultureInfo culture;
culture = CultureInfo.CreateSpecificCulture("it-IT");

CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;

Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;

Assembly resourceAssembly = Assembly.Load("MY ASSEMBLY NAME");
ResourceManager manager = Properties.Resources.ResourceManager;
string[] manifests = resourceAssembly.GetManifestResourceNames();

string manifest = manifests[0].Replace(".resources", string.Empty);
manager = new ResourceManager(manifest, resourceAssembly);

string greeting = String.Format("The current culture is {0}.\n{1}",
                                            Thread.CurrentThread.CurrentUICulture.Name,
                                            manager.GetString("HelloString"));

MessageBox.Show(greeting);

Так как это действительно большая программа с большим количеством страниц, окон и пользовательских контролей, мне нужно получить доступ к языку из множества разных файлов. Код, который я разместил выше, должен заглянуть в корень моего решения и найти файл с именем it-IT.resx. он говорит, что текущая культура это IT-IT, но он не записывает значение HelloString, но он не дает никакой ошибки, так что это определенно проблема с Resource Manager, но я не знаю, почему он не вылетает, говоря это не находит ресурс. Я уверен, что внутри файла resx есть значение с именем HelloString.

1 ответ

Есть ли причина загружать типы динамически с Assembly.Load()? Это напрашивается на неприятности. Другим способом было бы добавить ссылку на статическую сборку.

Этот подход имеет много преимуществ:

  • имена ресурсов могут быть доступны как имена свойств, это удобно
  • вызывающий код использует всегда существующие ресурсы
  • в вызывающем коде нет ссылок на несуществующие ресурсы

Чтобы иметь возможность использовать ресурсы из другой сборки, модификатор доступа к ресурсам должен быть установлен в public:

Если файл ресурсов назван RTextКак и в примере выше, значение ресурса может быть получено из другого проекта с помощью:

var val = ProjectWithResourcesNamespace.RText.HelloString;
Другие вопросы по тегам