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)