我有一个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表示它可以完成,但它似乎对我不起作用,可能是因为我无法为网站获得正确的命名空间?
答案 0 :(得分: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"));
所以,基于此,我在我想要在类库中使用的类中创建了一个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和语言的资源文件的名称。