Метод ResourceManager.GetString() возвращает неверную строку из разных сборок
У меня есть 2 файла ресурсов, один с английским и другой иностранный. Когда я звоню
ResourceManager.GetString("Hello")
из файла .Designer.cs всегда возвращается перевод на английский язык. Я проверил свой язык и язык и т.д., И все правильно.
он возвращает правильно переведенные строки из моей основной сборки, но из загруженных сборок он всегда возвращает английский.
Ответы
Ответ 1
Вот что происходило. У меня была сборка с несколькими файлами ресурсов перевода. Это все встроенные ресурсы.
Когда я скомпилировал сборку, он помещал английский по умолчанию в его .dll. Что касается других языков, он создавал папки, fr, da, de и т.д. С языками в.
Мне тоже пришлось переместить все это, если бы я хотел, чтобы их подхватили мое основное приложение, которое загружалось во все остальные сборки. Думал, как я сказал сборке, что все они были встроенными файлами ресурсов, они фактически вставляли бы их!
Теперь у меня есть AssemblyLoader
, который загружает все необходимые .dll, когда он не может найти их из своих текущих местоположений, упаковка будет определяться, хочу ли я включать все языки или выбирать те, которые я хочу, прежде чем строить проект, Больше работы, чем я надеялся, но решил в конце.
У любого есть вопрос, не стесняйтесь спрашивать.
Ответ 2
Не знаете, как вы создаете ResourceManager, но когда вы вызываете ResourceManager.GetString(), вы можете указать CultureInfo, который поможет вам получить строку в правильной локали. Поэтому вы можете сделать что-то вроде:
var string = ResourceManager.GetString("ResourceKey", new CUltureInfo("en-GB"));
Это приведет к тому, что строковый ключ будет указан в отдельном файле ресурсов en-GB.
Ответ 3
Первая перегрузка GetString, ResourceManager.GetString(string)
, использует текущий поток CurrentUICulture (Thread.CurrentThread.CurrentUICulture
).
Ссылаясь на MSDN: -
Возвращаемый ресурс локализуется для культуры пользовательского интерфейса текущего потока, как определено свойством CurrentUICulture.
В фоновом потоке не принимайте поток CurrentUICulture такой же, как ваш основной (или пользовательский) поток CurrentUICulture.
Лучший способ получить доступ к ресурсу из фонового потока - использовать что-то вроде следующего, чтобы получить правильную локализованную строку: -
var localString = Properties.Resources.ResourceManager.GetString("ResourceKey", CultureInfo.CurrentCulture);
Ответ 4
В моем случае проблема была с 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>
Ответ 5
Самый простой и быстрый способ, который я нашел, чтобы решить эту проблему динамически, - это получить язык, который в настоящее время используется в операционной системе, где работает приложение, и вызывать соответствующий ресурс. Вот код, чтобы выполнить это.
string lg = CultureInfo.CurrentCulture.TwoLetterISOLanguageName;
return resourceManager.GetString(text, new CultureInfo(lg));
Ответ 6
Попробуйте изменить действие сборки на "Встроенный ресурс". Я недавно столкнулся с этой проблемой при добавлении ресурса Tamil. Потратив пару часов, я понял, что этот простой шаг был пропущен после добавления файла ресурсов.