Менеджер по культурным ресурсам
проблема
Я пытаюсь внедрить систему в моей программе для переключения языка. Я узнал, что я могу использовать 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;