2012-07-05 55 views
4

对于我的网站,我有一个用于本地化目的的自定义资源提供程序(本地化字符串存储在数据库中)。它工作得很好,但我希望它能与默认的Resx资源提供程序一起工作:在resx资源中查找本地化的字符串,如果不存在,则将其从数据库中提取出来。本地化。扩展ASP.NET Resx资源提供程序

但它看起来,只要我更改IIS全球化设置使用我自己的资源提供程序工厂,然后默认的resx资源提供程序工厂被忽略。

我想解决方案是扩展我自己的资源提供者,但我找不到如何从我的资源提供者中引用resx资源。

谢谢。下面

回答

3

编辑

我的答案是错误的,因为在评论中指出。您可以通过使用反射如下获取ResXResourceProviderFactory

IResourceProvider resxProvider; 
string typeName = "System.Web.Compilation.ResXResourceProviderFactory, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; 
ResourceProviderFactory factory = (ResourceProviderFactory)Activator.CreateInstance(Type.GetType(typeName)); 
resxProvider = factory.CreateGlobalResourceProvider(classKey); 

(类似的方法来获取本地资源提供商)

然后,为了获取资源,所有的需要是调用GetObject的

object resource = p.GetObject("ResourceKey", new System.Globalization.CultureInfo("en")); 

您可以使用GetGlobalResourceObjectGetLocalResourceObject方法(部分HttpContext类)可以在自定义本地化类中使用.ResX文件。

例如,要得到一个从 “MyResxFile.resx” 叫 “的ResourceKey” 资源(*下* App_GlobalResources文件),当前的文化,你这样做:

HttpContext.GetGlobalResourceObject(
    "MyResxFile", 
    "ResourceKey", 
    System.Threading.Thread.CurrentThread.CurrentCulture 
); 
+0

'GetGlobalResourceObject'和' GetLocalResourceObject'正在使用当前资源提供程序,在我的情况下它是一个自定义提供程序。因此,在我的自定义本地资源提供程序的GetObject中调用'HttpContext.GetLocalResourceObject'将只会导致无限循环。 –

+0

@MaksimVi。当然你是对的,我的错误。请参阅我上面的编辑。 – McGarnagle

+0

好吧,它解决了GetGlobalResourceObject和GetLocalResourceObject的问题,但我的服务器控件的'meta:resourcekey'属性仍然被忽略。 –

0

好吧,它看起来是使用默认的resX资源提供程序扩展自定义资源提供程序并不能完全解决问题,因为隐式本地化表达式(meta:resourcekey)未得到本地化。

的可能的解决方案,我发现here是使用自定义的ResourceExpressionBuilder:

配置自定义提供商在所有 资源将被存储在另一个位置的情况下是伟大的,你不打算 分别利用位于App_LocalResources和 App_GlobalResources中的资源。如果你想支持 本地和全局资源的标准实现(默认 提供者),同时也可以从 中抽取一些资源(自定义提供者)的选项?您可以通过实施 自定义表达式来实现此目标,该表达式定位自定义资源提供程序。

这将允许使用RESX资源提供商,为您的自定义资源提供隐性和显性的本地化和自定义表达式:

<%-- Local ResX --%> 
<asp:Localize ID="locLocal" runat="server" Text="DefaultLocal" meta:resourcekey="locLocal" /> 
<%-- Global ResX --%> 
<asp:Localize ID="locGlobal" runat="server" Text="<%$ Resources:GlobalResourceStrings, locGlobal %>" /> 
<%-- Custom Resource Provider --%> 
<asp:Localize ID="locCust" runat="server" Text="<%$ ExternalResources:MyResources|CustomResourceStrings, locCust %>" meta:localize="false" /> 

或代码:

string s = (string)ExternalResourceExpressionBuilder.GetGlobalResourceObject("MyResources|CustomResourceStrings", "locCust");