Метод 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. Потратив пару часов, я понял, что этот простой шаг был пропущен после добавления файла ресурсов.