本土化。 扩展ASP.NET Resx资源提供程序

对于我的网站,我有一个用于本地化的自定义资源提供程序(本地化字符串存储在数据库中)。 它工作正常,但我希望它与默认的Resx资源提供程序一起使用:在resx资源中查找本地化字符串,如果不存在则从数据库中提取它。

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

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

谢谢。

编辑

正如评论中所指出的,我在下面的回答是错误的。 您可以使用reflection获取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")); 

您可以使用GetGlobalResourceObject和GetLocalResourceObject方法( HttpContext类的一部分)来处理自定义本地化类中的.ResX文件。

例如,要从“MyResxFile.resx”(在* App_GlobalResources *下)获取名为“ResourceKey”的资源,对于当前文化,您将使用以下命令:

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

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

我在这里找到的可能解决方案是使用自定义ResourceExpressionBuilder:

配置自定义提供程序非常适用于所有资源都将存储在备用位置的情况,并且您不打算分别利用位于App_LocalResources和App_GlobalResources中的资源。 如果您想支持本地和全局资源(默认提供程序)的标准实现,同时还可以选择从其他源(自定义提供程序)提取某些资源,该怎么办? 您可以通过实现面向自定义资源提供程序的自定义表达式来实现此目

这将允许使用resX资源提供程序为您的自定义资源提供程序提供隐式和显式本地化和自定义表达式:

 <%-- Local ResX --%>  <%-- Global ResX --%>  <%-- Custom Resource Provider --%>  

或在代码中:

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