2012-06-30 31 views
7

一个非常简单的事情,我无法让它工作。我想全球化我的DLL,因此我正在使用资源文件+ ResourceManager。Resourcemanager正在返回相同的资源,虽然指定了CultureInfo

我调用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 

所有文件设置都是一样的,但提到 - 只用在默认文件资源。

我在这里忽略了什么?

+2

是.resx文件实际上得到编译成附属程序集?查看bin \ Debug文件夹并查找名称为en,nl和nl-NL的子目录。 –

+0

尝试通过'Default.ResourceManager.GetString'获取翻译。很有可能你正在创建的资源管理器会得到一些错误的参数。 –

回答

10

有几种使用资源文件的方法,其中之一是使用.resx文件。这些文件会根据Thread.CurrentThread.CurrentUICulture的值自动进行本地化。默认的.resx文件被编译到它所属的程序集(例如你的主要可执行文件)中,而本地化资源(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); 

将输出

Hello 
Hallo 

在程序启动时,UI文化设置为它上运行的计算机的文化,让你赢不必自己指定语言以始终呈现本地化资源。所以,.resx文件似乎是要走的路。

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

如果你想使用ResourceManager能够指定的文化,你可以使用:

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

谢谢 - 我不知道为什么我不使用Resources.Default。必须是周末! –

+0

@CodeCaster请你看看我的问题。 http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc

相关问题