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

时间:2012-06-30 16:18:20

标签: 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.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

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

我在这里俯瞰什么?

1 个答案:

答案 0 :(得分:11)

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

在程序启动时,UI Culture被设置为其运行的计算机的文化,因此您不必自己指定语言以始终显示本地化资源。所以,Hello Hallo 文件似乎还有很长的路要走。

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

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

.resources