对于我的网站,我有一个用于本地化目的的自定义资源提供程序(本地化字符串存储在数据库中)。它工作得很好,但我希望它与默认的Resx资源提供程序一起工作:在resx资源中查找本地化字符串,如果不存在,则从数据库中拉出它。
但是看起来,只要我将IIS全球化设置更改为使用我自己的资源提供程序工厂,那么默认的resx资源提供程序工厂就会被忽略。
我想解决方案是扩展我自己的资源提供程序,但是我不知道如何从我的资源提供程序内部引用resx资源。
谢谢。
发布于 2012-07-05 09:15:24
编辑
我下面的答案是错误的,正如评论中指出的那样。您可以通过使用反射获取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
);发布于 2012-07-06 03:45:56
因为隐式本地化表达式(meta:resourcekey)没有本地化,所以用默认的resX资源提供程序扩展自定义资源提供程序看起来并不能完全解决这个问题。
我发现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");https://stackoverflow.com/questions/11336763
复制相似问题