尽管指定了CultureInfo,Resourcemanager仍返回相同的资源

Joc*_*ick 8 c# globalization dll resourcemanager embedded-resource

一件非常简单的事情,我无法让它发挥作用.我想全局化我的DLL,因此我使用资源文件+ ResourceManager.

我将资源管理器称为:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());
Run Code Online (Sandbox Code Playgroud)

得到这样的字符串

System.Diagnostics.Debug.WriteLine(p.GetString("greeting"));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl")));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL")));
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en")));
Run Code Online (Sandbox Code Playgroud)

它返回相同字符串的4倍.我的文件被调用

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx
Run Code Online (Sandbox Code Playgroud)

所有文件设置都相同,但如上所述 - 仅使用默认文件中的资源.

我在这里俯瞰什么?

Cod*_*ter 11

有几种方法可以使用资源文件,其中一种方法是使用.resx文件.这些文件会根据值自动进行本地化Thread.CurrentThread.CurrentUICulture.默认.resx文件被编译到它所属的程序集中(例如,您的主可执行文件),而本地化的resources(Default.nl-NL.resx)被编译到它们自己的目录中(nl-NL在这种情况下基于文化标识符)到一个名为的程序集中<AssemblyName>.resources.dll.

<ResourceName>.<KeyName>例如,从这些资源中寻址值就像这样容易Default.Greeting.要测试它,您可以使用以下方法更改文化:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Default.Greeting);

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL");
Console.WriteLine(Default.Greeting);
Run Code Online (Sandbox Code Playgroud)

哪个会输出

Hello
Hallo
Run Code Online (Sandbox Code Playgroud)

在程序启动时,UI Culture被设置为运行它的计算机的文化,因此您不必自己指定语言以始终显示本地化资源.所以,.resx文件似乎要走了.

使用ResourceManagerfrom时var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());,您必须阅读.resources文件.如果没有(在您的情况下)Appname.Default.resources文件,p.GetString则会失败.所以我猜你之前已经创建了一个.resources文件,但没有将本地化.resx文件转换为.resources文件.

如果要使用ResourceManager来指定区域性,可以使用:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)