如何在类库中访问全局资源进行本地化?

时间:2011-02-23 16:38:44

标签: .net localization

我有一个asp.net网站(不是网络应用程序),我使用资源文件(.resx)本地化了UI的文本。我还有一个包含业务逻辑的类库,还有一个返回错误消息的验证方法。我需要本地化该错误消息,但无法找到一种方法来访问我的网站中的全局资源文件。在网站上,在后面的代码中,我可以使用Resources.LocalisedText.MyErrorMessage(其中LocalisedText是我的资源文件LocalisedText.resx的名称)。但是在我的类库中,我无法获得它的引用。

我发现这个链接http://weblogs.asp.net/rinze/archive/2008/12/03/using-globalization-resources-resx-in-a-class-library-or-custom-control.aspx表示它可以完成,但它似乎对我不起作用,可能是因为我无法为网站获得正确的命名空间?

2 个答案:

答案 0 :(得分:5)

我设法根据resx的设计器文件使其工作。如果您打开它并查看ResourceManager属性的get访问者,您基本上只需复制该行即可访问相同的资源。

完整说明

首先,您需要打开资源文件的.designer.cs文件。它应该在您的解决方案资源管理器中,如下图所示:

Resource file designer file location in solution explorer

只需双击即可打开它然后扫描(它应该在顶部附近):
internal static global::System.Resources.ResourceManager ResourceManager {

get访问器中,您应该看到它为临时变量赋值。就我而言,它看起来像这样:

/*...*/ temp = new global::System.Resources.ResourceManager("Resources.Lang",
               global::System.Reflection.Assembly.Load("App_GlobalResources"));

所以,基于此,我在我想要在类库中使用的类中创建了一个ResourceManager,如下所示:

ResourceManager lang = new ResourceManager("Resources.Lang",
                                           Assembly.Load("App_GlobalResources"));

注1:不要忘记将using System.Resources;using System.Reflection;添加到文件顶部。
注2:这不需要将Web项目的引用添加到类库中。

然后,我只需在我的GetString变量上调用lang方法即可获得我想要的资源。
例如。 lang.GetString("MyErrorMessage")
它不如调用Resources.Lang.MyErrorMessage那么优雅,但它完成了工作。

希望这会有所帮助。如果您有任何问题,请在下面发表评论。

答案 1 :(得分:0)

new ResourceManager("YourRessourceName", Assembly.GetEntryAssembly()).GetString("MyLocalizedString");

在这里使用执行程序集(您的网站)构建ressourceManager,“YourRessourcenName”是没有resx和语言的资源文件的名称。