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

gic*_*ces 6 .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这说它可以完成,但它似乎对我不起作用,可能是因为我无法为网站获得正确的命名空间?

Ric*_*kir 5

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

完整解释

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

解决方案资源管理器中的资源文件设计器文件

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

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

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

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

ResourceManager lang = new ResourceManager("Resources.Lang",
                                           Assembly.Load("App_GlobalResources"));
Run Code Online (Sandbox Code Playgroud)

注1:不要忘了补充using System.Resources;,并using System.Reflection;在文件的顶部.
注意2:这不需要将Web项目的引用添加到类库中.

然后,我只是GetString在我的lang变量上调用方法来获取我想要的资源.
例如lang.GetString("MyErrorMessage").
它并不像打电话那么优雅Resources.Lang.MyErrorMessage,但它完成了工作.

希望这可以帮助.如果您有任何疑问,请在下面发表评论.


rem*_*rel -1

new ResourceManager("YourRessourceName", Assembly.GetEntryAssembly()).GetString("MyLocalizedString");
Run Code Online (Sandbox Code Playgroud)

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