从字符串资源动态获取字符串

33

我正在开发一款本地化的C#.NET应用程序,我们使用一个strings.resx文件来翻译应用程序中硬编码的字符串。我使用以下代码来提取这些字符串:

using MyNamespace.Resources

...

string someString = strings.someString;

但是,现在我想要能够在调用时定义字符串的名称,类似于这样:

string someString = GetString("someString");

我已经开始尝试使用ResourceManager,但是我找不到一种方法来引用我的strings.resx文件。

我该怎么做呢?

5个回答

52

稍微搜索了一下,问题得到解决了。我在我的strings类中有正确的ResourceManager可用:

ResourceManager rm = strings.ResourceManager;
string someString = rm.GetString("someString");

23

ResourceManager.GetString应该可以。

来自MSDN的简化实例:

ResourceManager rm = new ResourceManager("RootResourceName",
                                         typeof(SomeClass).Assembly);
string someString = rm.GetString("someString");

1
是的,我找到了,但是现在不知道该如何实例化我的ResourceManager。我已经通过ResourceManager rm = strings.ResourceManager;使其工作了。无需实例化:它已经存在了。 - Bart Friederichs
1
@Bart:你尝试过使用汇编构造函数了吗? - Vlad
2
是的,但我不知道"RootResourceName"SomeClass应该是什么。使用strings.ResourceManager更容易。 - Bart Friederichs
2
@Bart:类仅用于访问程序集。您可以尝试使用Assembly.GetCurrentAssembly或类似方法。根据文档,“RootResourceName”是“资源文件的根名称,不包括扩展名,但包括任何完全限定的命名空间名称。例如,名为MyApplication.MyResource.en-US.resources的资源文件的根名称为MyApplication.MyResource。”但是,如果资源管理器已经可用,最好直接获取。 - Vlad

12

我在使用ASP.NET Core MVC时遇到了同样的问题,并成功解决了它,方法如下:

ResourceManager rm = new ResourceManager(typeof(YourResourceClass));
string someString = rm.GetString("someString");

与@ Vlad的解决方案非常相似,但除此之外,我遇到了MissingManifestResourceException异常



10

有一种更简单的方式来做这件事

 [NameOfyourResxfile].ResourceManager.GetString("String Name");

在您的情况下

strings.resx.ResourceManager.GetString("someString");

5

您可以编写如下的静态方法:

public static string GetResourceTitle<T>(string key)
{
  ResourceManager rm = new ResourceManager(typeof(T));
  string someString = rm.GetString(key);
  return someString;
}

并且可以随时拨打电话:

var title=  GetResourceTitle<*YouResourceClass*>(key);

当您想要编写一个通用函数以获取任何资源文件的字符串时,这非常有用。


非常好的解决方案! - Silagy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接