Using ResourceManager

本文关键字:ResourceManager Using | 更新日期: 2023-09-27 18:20:13

我正试图在C#类中使用ResourceManager,但不知道在创建ResourceManager类的新实例时用什么来替换基名称。

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

  • 资源.resx
  • 资源.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"在编译时正确嵌入或链接到程序集"YeagerTech"中,或者确保所需的所有附属程序集都是可加载的并完全签名的。

我能够毫无问题地使用HTML标记中的资源,但当涉及到控制器中的C#代码时,我不断地收到上面的错误。

如果您能根据我的项目为我提供所需的确切语法帮助,我们将不胜感激。

Using ResourceManager

有一种惊人的简单方法可以通过字符串读取资源:

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

这是一个干净而优雅的解决方案,用于在不能使用"点表示法"的情况下(例如,当资源键被持久化在数据库中时)通过键读取资源。

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

您的.resources是在resources projectsobj/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);

在这种情况下,这个SO答案可能会有所帮助
如果main项目已经引用资源,那么您可以在代码中显式地使用生成的资源类,并从中访问其ResourceManager。因此,沿着以下路线:

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

根据这里的MSDN文档,basename参数指定"资源文件的根名称,不带扩展名,但包括任何完全限定的命名空间名称。例如,名为"MyApplication.MyResource.en-US.resources"的资源文件的根名是"MyApplication''MyResource"。"

ResourceManager将自动尝试检索当前UI区域性的值。如果要使用特定语言,则需要将当前UI区域性设置为要使用的语言。

在pricipiple中,这与@Landeyos的想法相同。无论如何,在回应的基础上:派对有点晚了,但这是我的两分钱:

场景:

我有一个独特的案例,在我的WPF应用程序中添加一些预定义的模板文件(大约28个文本文件)。因此,我们的想法是,每次安装这个应用程序时,这些模板、文本文件都可以随时使用。无论如何,我所做的是通过添加resource.resx来创建一个单独的库来保存文件。然后我将所有这些文件添加到这个资源文件中(如果双击.resx文件,它的设计器将在visualstudio中打开)。我已经将访问修饰符设置为公共的。此外,每个文件都通过每个文本文件的构建操作标记为嵌入资源(您可以通过查看其属性来获得)。让我们把这个书目称为k1.dll我在另一个库(称之为bibliothek2.dll)中引用了上面的这个库(bibliothk1.dll),然后在mf-wpf应用程序中使用了第二个库。

真正的乐趣:

        // 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);

示例:checkout"testingresourcefilesusage"@https://github.com/Natsikap/samples.git

我希望它能帮助到某个人,某一天,某个地方!

我也遇到过类似的问题。如果您考虑您的"YeagerTechResources.Resources",则意味着您的Resources.resx位于项目的根文件夹中。

请注意在ResourceManager构造函数中包含完整路径,例如:"project''subfolder(s)''file[.resx]"。