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

时间:2012-07-05 00:59:23

标签: c# asp.net localization globalization

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

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

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

感谢。

2 个答案:

答案 0 :(得分: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);

(获取 Local 资源提供程序的类似方法。)

然后,为了获得资源,所需要的只是调用 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
);

答案 1 :(得分: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");