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

C# 尽管指定了CultureInfo,Resourcemanager仍返回相同的资源,c#,dll,globalization,embedded-resource,resourcemanager,C#,Dll,Globalization,Embedded Resource,Resourcemanager,一件很简单的事情,但我不能让它工作。我想全局化我的dll,因此我使用的是资源文件+资源管理器 我这样称呼resourcemanager: var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 像这样得到字符串 System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); System.Diagnostics.Debug.Writ

一件很简单的事情,但我不能让它工作。我想全局化我的dll,因此我使用的是资源文件+资源管理器

我这样称呼resourcemanager:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());
像这样得到字符串

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")));
它返回相同字符串的4倍。我的文件被称为

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


这里我忽略了什么?

有几种使用资源文件的方法,其中一种是使用
.resx
文件。这些文件将根据
Thread.CurrentThread.CurrentUICulture
的值自动本地化。默认的
.resx
文件被编译到它所属的程序集中(例如您的主可执行文件),而本地化的资源(
default.nl.resx
)被编译到它们自己的目录中(在本例中基于区域性标识符,
nl
)到一个名为
.resources.dll
的程序集中

从这些资源中寻址值与
一样简单,例如
Default.Greeting
。要进行测试,请使用以下方法更改区域性:

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

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL");
Console.WriteLine(Default.Greeting);
哪个会输出

Hello
Hallo
在程序启动时,UI区域性设置为其运行的计算机的区域性,因此您不必自己指定语言来始终显示本地化的资源。因此,
.resx
文件似乎是一条出路

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

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

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US"));

.resx文件是否实际编译到附属程序集中?在bin\Debug文件夹中查找名为en、nl和nl-nl的子目录。尝试通过
Default.ResourceManager.GetString
获取翻译。很可能您正在创建的资源管理器获取了一些错误的参数。谢谢-我不知道为什么我不使用Resources.Default。一定是周末了@你能看看我的问题吗。