如何在运行时在C#中为Nuget数据包切换CultureInfo?

时间:2018-11-07 16:34:06

标签: c# nuget globalization

我们正在Visual Studio 2017中工作,并希望通过nuget使用.NET Framework 4.6.1提供c#类库项目。问题在于该项目使用了资源文件。

项目结构如下:

  • 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,或者,或者,... ???

编辑: 如果我使用Rui Jarimba的nuget结构,则引用的文章Creating localized NuGet packages 如果我在每个特定于语言的dll旁边都包含每个特定于语言的resx文件,并且如果我在第一次访问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!

编辑2: 但是这种方法只适用一次! 如果我这样做:

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 @LasseVågsætherKarlsen: 正如我在第一次EDIT中已经说过的,nuget文件包含以下结构的解压缩:

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

0 个答案:

没有答案