4

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

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

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

谢谢。

4

2 回答 2

4

编辑

正如评论中所指出的,我在下面的回答是错误的。您可以使用反射获取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”(在 *App_GlobalResources* 下)获取名为“ResourceKey”的资源,对于当前区域性,您可以使用以下命令:

HttpContext.GetGlobalResourceObject(
    "MyResxFile", 
    "ResourceKey", 
    System.Threading.Thread.CurrentThread.CurrentCulture
);
于 2012-07-05T01:15:24.480 回答
0

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

我在这里找到的可能解决方案是使用自定义 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");
于 2012-07-05T19:45:56.307 回答