Как переключить CultureInfo во время выполнения на C# для пакета nuget?

мы работаем в Visual Studio 2017 и не хотим предоставить проект библиотеки классов C# с использованием .NET Framework 4.6.1 через nuget. Проблема в том, что в проекте используются файлы ресурсов.

Структура проекта такая:

  • ProjectFile.csproj
  • MainLibClass.cs
  • Resource.de-De.resx
  • Resource.en-Us.resx
  • Resource.resx
    • Resource.Designer.cs

MainLibClass обращается к ресурсам следующим образом:

using System.Threading;
using System.Globalization;

public class MainLibClass
{
...
   public void SetCurrentThreadToCulture(string cultureName)
   {
        Thread.CurrentThread.CurrentCulture   = CultureInfo.CreateSpecificCulture(cultureName);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
   }

   public string foo()
   {...
      string resourceValue = Resource.ResourceManager.GetString(valueNodeName);
      return resourceValue
   }
}

Этот проект работает и протестирован для разных культур (en-US, de-DE, ...)

Затем я создал пакет nuget. Из консоли в папке с файлом ProjectFile.csproj я запустил:

nuget spec
nuget pack ProjectFile.csproj -IncludeReferencedProjects 

или

nuget pack ProjectFile.csproj -IncludeReferencedProjects -symbols

Затем я создал небольшое тестовое консольное приложение (с использованием .NET Framework 4.6.1), в котором новый пакет nuget установлен правильно. Тестовое приложение делает что-то вроде:

MainLibClass reader = new MainLibClass();
reader.SetCurrentThreadToCulture("de-DE");//"en-US"
string resValTranslated = reader.foo();//Contains only Resource.resx data

Теперь перевод больше не работает! Кто-нибудь знает решение этой проблемы?

Могу ли я встроить ресурсы в nuget dll, или мне нужно реструктурировать nuget, или, или ... ???

Обновлено: Если я использую структуру nuget из статьи Руи Джаримбы, на которую ссылается Создание локализованных пакетов NuGet И если я включаю файлы resx для каждого языка рядом с каждой DLL, зависящей от языка, и если я устанавливаю культуру перед первым доступом к классу nuget, то это работает! Итак, если я изменю тестовое приложение на:

Thread.CurrentThread.CurrentCulture   = CultureInfo.CreateSpecificCulture("en-US");
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");

MainLibClass reader = new MainLibClass();
string resValTranslated = reader.foo();//Now it works!

Обновлено еще раз: Но этот подход работает только один раз! Если я сделаю :

Thread.CurrentThread.CurrentCulture   = CultureInfo.CreateSpecificCulture("en-US");
    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");

    MainLibClass reader = new MainLibClass();
    string resValTranslated = reader.foo();//Now it works!

Thread.CurrentThread.CurrentCulture   = CultureInfo.CreateSpecificCulture("de-DE");
    Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");

    MainLibClass reader2 = new MainLibClass();
    resValTranslated = reader2.foo();//Now it dont!

ИЗМЕНИТЬ 3 @Lasse Vågsæther Карлсен: Как я уже сказал в первом РЕДАКТИРОВАНИИ, файл nuget содержит в распакованном виде следующую структуру:

  • lib
    • net461
      • de-DE
        • MainLibClass.resources.dll
        • Resource.de-DE.resx
      • en-US
        • MainLibClass.resources.dll
        • Resource.en-US.resx
      • MainLibClass.dll
      • Resource.resx

Вы подтверждаете, что пакет nuget создан правильно, т.е. файлы .resx включены? Также см. Создание локализованных пакетов NuGet

Rui Jarimba 07.11.2018 17:42

Как делал установку? Вы публиковали? Framework использует библиотеки DLL Windows, и если библиотеки DLL не совпадают на компьютерах для сборки и развертывания, этот код не будет работать одинаково. Публикация приложения гарантирует, что на машине развертывания установлены правильные библиотеки DLL.

jdweng 07.11.2018 17:44

@jdweng Я сделал это на своей машине

user1911091 07.11.2018 17:52

@Rui Jarimba, я просто попытался структурировать nuget, как в вашей упомянутой статье. Если я компилирую ProjectFile.csproj, я получаю DLL для каждого языка, но я включаю только скомпилированные библиотеки для каждого языка, а не ресурсы, и это не работает!

user1911091 07.11.2018 17:58

Наиболее очевидная причина заключается в том, что установщик пакета nuget забывает скопировать вспомогательные сборки и обеспечивает их копирование в каталог сборки проекта. Вы бы сказали, что это непросто.

Hans Passant 07.11.2018 18:45

Пакет nuget - это zip-файл, распакуйте его и посмотрите его содержимое, все ли сборки ресурсов присутствуют?

Lasse V. Karlsen 08.11.2018 12:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
316
0

Другие вопросы по теме