一件非常简单的事情,我无法让它发挥作用。我想全局化我的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
所有文件设置都相同,但如上所述 - 仅使用默认文件中的资源。
我在这里俯瞰什么?
答案 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