9

一个非常简单的事情,我无法让它工作。我想全球化我的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

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

我在这里俯瞰什么?

4

1 回答 1

12

有几种使用资源文件的方法,其中一种是使用.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文件似乎是要走的路。

使用ResourceManagerfromvar 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"));
于 2012-06-30T16:52:59.680 回答