使用ResourceManager

sag*_*y36 25 c# localization resourcemanager

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

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

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

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

ResourceManager RM = new ResourceManager(basename,Assembly.GetExecutingAssembly());
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources",
    Assembly.GetExecutingAssembly());
Run Code Online (Sandbox Code Playgroud)

显然,这是不正确的.

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

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

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

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

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

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

sb.Append(RM.GetString("RegisterThanks"));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Lan*_*eyo 42

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

ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")
Run Code Online (Sandbox Code Playgroud)

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

  • 更简单:在代码文件中添加"使用RootNamespace.Properties"(在项目属性中定义rootnamespace),然后执行:Resources.<ResourceName>.不过,我不确定你是否可以用这个做本地化. (4认同)
  • @Muflix只是资源文件的命名空间。 (2认同)

小智 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());
Run Code Online (Sandbox Code Playgroud)

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

Assembly localisationAssembly = Assembly.Load("MyLocalisation");
ResourceManager RM =  new ResourceManager("MyLocalisation.Properties.Resources", localisationAssembly);
Run Code Online (Sandbox Code Playgroud)


sup*_*jos 10

在这种情况下,这个答案可能有所帮助.
如果项目已经引用了资源项目,那么您可以在代码中明确地使用您生成的资源类,并ResourceManager从中访问它.因此,有些东西:

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager;

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


Tom*_*int 4

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

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