Объект 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>