使用ResourceManager

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

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

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

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

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

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

找不到适合指定文化或中性文化的资源。

我的解决方案有两个项目,项目YeagerTech是一个Web应用程序,项目YeagerTechResources包含所有资源。 Project 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#代码时,我继续得到上述错误。

根据我的项目所需的确切语法的任何帮助将不胜感激。

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

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

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

快速而又脏的方法来检查生成的.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); 

在这种情况下,这个答案可能有所帮助。
如果项目已经引用了资源项目,那么您可以在代码中显式使用您的generated-resource类,并从中访问其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“的资源文件的根名称。资源“是”MyApplication.MyResource“。

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

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

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

在原则上它与@Landeeyos的想法相同。 无论如何,扩大回应:对党来说有点晚了,但这是我的两分钱:

场景:

我有一个独特的例子,用我的WPF应用程序添加一些(大约28个文本文件)预定义的模板文件。 因此,我们的想法是,每次安装此应用程序时,这些模板,文本文件都可以随时使用。 无论如何,我所做的是通过添加resource.resx创建了一个单独的库来保存文件。 然后我将所有这些文件添加到此资源文件中(如果双击.resx文件,其设计器将在visual studio中打开)。 我已将Access Modifier设置为public for public。 此外,每个文件都通过每个文本文件的构建操作标记为嵌入式资源(您可以通过查看其属性来获取该文件)。 让我们调用这个bibliothek1.dll我在另一个库中引用了上面的库(bibliothek1.dll)(称之为bibliothek2.dll),然后在mf wpf app中使用了第二个库。

实际的乐趣:

  // embedded resource file name with out extension(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

我希望有一天,某个地方帮助某人!