Resourcemanager возвращает тот же ресурс, хотя указана информация о культуре

Очень простая вещь, и я не могу заставить ее работать. Я хочу глобализировать свою dll, поэтому я использую файлы ресурсов + ResourceManager.

Я вызываю менеджера ресурсов следующим образом:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());

Получите такие строки

System.Diagnostics.Debug.WriteLine(p.GetString("greeting"));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl")));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL")));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en")));

И он возвращает 4 раза одну и ту же строку. Мои файлы называются

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx

Все настройки файла одинаковы, но, как уже упоминалось, используется только ресурс в файле по умолчанию.

Что я здесь упускаю?


person Jochen van Wylick    schedule 30.06.2012    source источник
comment
Действительно ли файл .resx компилируется в вспомогательные сборки? Загляните в папку bin\Debug и найдите подкаталоги с именами en, nl и nl-NL.   -  person Hans Passant    schedule 30.06.2012
comment
Попробуйте получить переводы через Default.ResourceManager.GetString. Скорее всего, создаваемый вами менеджер ресурсов получает неправильные параметры.   -  person Marcel N.    schedule 30.06.2012


Ответы (1)


Существует несколько способов использования файлов ресурсов, один из которых — использование файлов .resx. Эти файлы локализуются автоматически в зависимости от значения Thread.CurrentThread.CurrentUICulture. Файл .resx по умолчанию компилируется в сборку, частью которой он является (например, ваш основной исполняемый файл), в то время как локализованные ресурсы (Default.nl-NL.resx) компилируются в свой собственный каталог (на основе идентификатора культуры, в данном случае nl-NL) в сборку, называется <AssemblyName>.resources.dll.

Адресовать значения из этих ресурсов так же просто, как <ResourceName>.<KeyName>, например Default.Greeting. Чтобы проверить это, вы меняете культуру, используя:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Default.Greeting);

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL");
Console.WriteLine(Default.Greeting);

Что будет выводить

Hello
Hallo

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

При использовании ResourceManager из var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); вам придется прочитать .resources файлов. Если нет (в вашем случае) файла Appname.Default.resources, то p.GetString не получится. Итак, я предполагаю, что вы создали один файл .resources ранее, но не преобразовали локализованные файлы .resx в файлы .resources.

Если вы хотите использовать ResourceManager для указания культуры, вы можете использовать:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US"));
person CodeCaster    schedule 30.06.2012
comment
Спасибо - я не знаю, почему я просто не использовал Resources.Default. Должно быть выходные! - person Jochen van Wylick; 30.06.2012
comment
@CodeCaster, не могли бы вы взглянуть на мой вопрос, пожалуйста. stackoverflow.com/questions/24070892/ - person Marc; 27.11.2014