使用ResourceManager

时间:2012-01-11 19:29:11

标签: c# localization resourcemanager

我正在尝试在C#类中使用ResourceManager,但在创建ResourceManager类的新实例时不知道替换basename的内容。

我有一个单独的项目,其中包含上面我的项目引用的资源文件,命名如下:

  • Resources.resx
  • Resources.es-ES.resx

如果我有如下代码片段,当我想使用英语或西班牙语版本的资源时,我应该用什么替代基本名称?

ResourceManager RM = new ResourceManager(basename,Assembly.GetExecutingAssembly());

我尝试过汤姆建议的方法,但我得到了臭名昭着的错误

  

无法找到适合指定文化或中性文化的任何资源。

我的解决方案有两个项目,项目YeagerTech是一个Web应用程序,项目YeagerTechResources包含所有资源。 YeagerTech项目提到了YeagerTechResources。

创建资源管理器时,我有以下语法:

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources",
    Assembly.GetExecutingAssembly());

显然,这是不正确的。

YeagerTechResources项目中的资源文件将其BuildAction设置为Embedded Resource。

我的资源文件的名称是:Resources.resx和Resources.es-ES.resx。

如果有人可以在实例化资源管理器时根据我的项目和资源文件名告诉我确切的语法,我将非常感激...

我已经做了我能想到的一切来解决这个问题而且不能......

这是我在这里解决问题的最后一次尝试......

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources", Assembly.GetExecutingAssembly());

sb.Append(RM.GetString("RegisterThanks"));

执行上面的代码后,我收到以下错误:

  

无法找到适合指定文化或中性文化的任何资源。确保在编译时将“YeagerTechResources.Resources.resources”正确嵌入或链接到程序集“YeagerTech”中,或者所有所需的附属程序集都是可加载和完全签名的。

我能够完全没有问题地使用HTML标记中的资源,但是当转到Controller中的C#代码时,我继续得到上述错误。

非常感谢基于我的项目所需的确切语法的任何帮助。

6 个答案:

答案 0 :(得分:39)

通过字符串读取资源的方式非常简单:

ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")

这是一个干净而优雅的解决方案,用于通过键来读取资源,其中不能使用“点符号”(例如,当资源键持久存储在数据库中时)。

答案 1 :(得分:17)

检查生成的.resources文件所需的字符串的快速而脏的方法。

您的.resources是在资源项目 obj / Debug 目录中生成的。 (如果没有右键单击解决方案资源管理器中的.resx文件并点击“运行自定义工具”来生成.resources文件)

导航到此目录并查看文件名。您应该看到以XYZ.resources结尾的文件。复制该文件名并删除尾随.resources,这是您应该加载的文件。

例如,在我的obj / Bin目录中,我有文件:

<强> MyLocalisation.Properties.Resources.resources

如果资源文件在同一类库/应用程序中,我将使用以下C#

ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", Assembly.GetExecutingAssembly());

但是,听起来您正在使用来自单独的类库/应用程序的资源文件,您可能需要

Assembly localisationAssembly = Assembly.Load("MyLocalisation");
ResourceManager RM =  new ResourceManager("MyLocalisation.Properties.Resources", localisationAssembly);

答案 2 :(得分:10)

在这种情况下,

This SO answer可能会有所帮助 如果 main 项目已经引用了资源项目,那么您可以在代码中明确使用您生成的资源类,并从中访问其ResourceManager 。因此,有些东西:

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

// then, you could go on working with that
ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
// ...

答案 3 :(得分:4)

根据MSDN文档here,basename参数指定“资源文件的根名称,但没有扩展名但包含任何完全限定的名称空间名称。例如,资源文件的根名称名为“MyApplication.MyResource.en-US.resources”的是“MyApplication.MyResource”。

ResourceManager将自动尝试检索当前UI文化的值。 如果您想使用特定语言,则需要将当前的UI文化设置为您希望使用的语言。

答案 4 :(得分:0)

我遇到了类似的问题。 如果您考虑“YeagerTechResources.Resources”,则表示您的Resources.resx位于项目的根文件夹中。

小心将完整路径包括在内:例如:“project \ subfolder(s)\ file [.resx]”到ResourceManager构造函数。

答案 5 :(得分:0)

原则上,它与@Landeeyos的想法相同。无论如何,请扩大回应范围: 开派对有点晚,但这是我的两分钱:

场景:

我有一种独特的情况,那就是在我的WPF应用程序中添加一些(大约28个文本文件)预定义的模板文件。因此,其想法是,每次要安装此应用程序时,这些模板,文本文件将随时可用。无论如何,我所做的就是通过添加resource.resx来创建一个单独的库来保存文件。然后,我将所有这些文件添加到此资源文件中(如果双击.resx文件,则其设计器将在Visual Studio中打开)。我已经将“访问修饰符”设置为对所有人公开。另外,通过每个文本文件的“构建操作”,每个文件都被标记为嵌入式资源(您可以通过查看其属性来获取)。我们称之为bibliothek1.dll 我在另一个库(称为bibliothek2.dll)中引用了上述库(bibliothek1.dll),然后在MFWPF应用程序中使用了第二个库。

实际的乐趣:

        // embedded resource file name <i>with out extension</i>(this is vital!) 

        string fileWithoutExt = Path.GetFileNameWithoutExtension(fileName);

        // is required in the next step

        // without specifying the culture
        string wildFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt);
        Console.Write(wildFile);

        // with culture
        string culturedFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt, CultureInfo.InvariantCulture);
        Console.Write(culturedFile);

样品: 结帐'testingresourcefilesusage'@ https://github.com/Natsikap/samples.git

我希望它能在某天某处对某人有所帮助!