2011-02-23 103 views
6

我有一个asp.net网站(不是web应用程序),我已经使用资源文件(.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它说,它可以完成,但它似乎并没有为我工作可能是因为我无法得到正确的网站名称空间?

+1

我设法找到一个解决方案,这是通过在类库本身中添加一个资源文件。这工作正常,但我希望只有一个资源文件,如果可能的话。所以,如果你们中有人知道如何引用网站中的.resx文件,请告诉我。 – gices 2011-02-23 17:06:15

回答

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

这里你建立一个使用执行的程序集(您的网站)一个ressourceManager,“YourRessourcenName”是没有的resx和语言你的ressource文件的名称。

+0

装配。GetEntryAssembly()似乎为Web应用程序返回null。 – 2012-10-03 07:01:10

4

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

充分说明

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

Resource file designer file location in solution explorer

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

get访问器,您应该看到它将某些内容分配给临时变量。在我的情况是这样的:

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

注1:

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

因此,基于这一点,我在我想在我的类库使用像这样的类创建的ResourceManager不要忘记将using System.Resources;using System.Reflection;添加到文件的顶部。
注2:这不需要将对Web项目的引用添加到类库中。

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

希望这会有所帮助。如果您有任何问题,请在下面留言。