Объект ResourceManager.Метод GetString () возвращает неправильную строку из разных сборок

У меня есть 2 файла ресурсов, один с английским и другим иностранным. Когда я позову

ResourceManager.GetString("Hello") 

от .Дизайнер.cs-файл всегда возвращает английский перевод. Я проверил свой язык и язык и т. д. и все правильно.

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

4 ответов


вот что происходит. У меня была сборка с несколькими файлами ресурсов перевода. Все это были встроенные ресурсы.

когда я скомпилировал сборку, она помещала в нее английский язык по умолчанию .файл DLL. Что касается других языков, то он создавал папки, fr, da, de и т. д. с языками.

мне пришлось переместить все это, если я хотел, чтобы они были подобраны моим основным приложением, которое загружалось во все эти другие сборки. Думал, как я сказал сборка, что все они были встроенными файлами ресурсов, на самом деле встраивала их!

теперь у меня есть AssemblyLoader который загружает все необходимое .dll, когда он не может найти их из своих текущих местоположений, упаковка будет определяться тем, хочу ли я включить все языки или выбрать те, которые я хочу, прежде чем строить проект. Работы оказалось больше, чем я надеялся, но в конце концов она была решена.

кто-нибудь есть какие-либо вопросы, не стесняйтесь спрашивать.


первая перегрузка GetString,ResourceManager.GetString(string), использует CurrentUICulture текущего потока (Thread.CurrentThread.CurrentUICulture).

со ссылкой на MSDN:-

возвращаемый ресурс локализуется для культуры пользовательского интерфейса текущего потока, как определено свойством CurrentUICulture.

в фоновом потоке не предполагайте, что CurrentUICulture потока совпадает с CurrentUICulture вашего основного (или пользовательского интерфейса) потока.

A лучший способ получить доступ к ресурсу из фонового потока-использовать что-то вроде следующего, чтобы получить правильную локализованную строку: -

var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);

Не уверен, как создается экземпляр ResourceManager, но при вызове ResourceManager.GetString (), вы можете указать CultureInfo, который поможет вам получить строку в правильной локали. Так что вы можете сделать что-то вроде:

var string = ResourceManager.GetString("ResourceKey", new CUltureInfo("en-GB"));

Это гарантирует, что строковый ключ из файла ресурсов en-GB.


в моем случае проблема была с resx-файлом. Неверные строки ресурсов имели неправильный формат в файле resx:

<data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
  <settings>
    Month   Date    Department
    01.05.2015  01.05.2015  OIR
    01.05.2015  02.05.2015  OIR
  </settings>
</data>

неверный формат:

<data name="HeaderColumnsCountGreaterThenDataColumnsCountTestData" xml:space="preserve">
  <value>
    Month   Date    Department
    01.05.2015  01.05.2015  OIR
    01.05.2015  02.05.2015  OIR
  </value>
</data>