对于我的网站我有本地化的目的(本地化字符串存储在数据库中)自定义资源提供者。 它工作得很好,但我想它与默认的RESX资源提供者工作:查找本地化的字符串中的resx资源,如果不存在,然后从数据库中拉出。
但看起来,一旦更改IIS设置的全球化使用自己的资源供应商的工厂,那么默认的resx资源供应商的工厂被忽略。
我猜的解决办法是延长我自己的资源提供者,但我无法找到如何从我的资源提供者的内部参考RESX资源。
谢谢。
对于我的网站我有本地化的目的(本地化字符串存储在数据库中)自定义资源提供者。 它工作得很好,但我想它与默认的RESX资源提供者工作:查找本地化的字符串中的resx资源,如果不存在,然后从数据库中拉出。
但看起来,一旦更改IIS设置的全球化使用自己的资源供应商的工厂,那么默认的resx资源供应商的工厂被忽略。
我猜的解决办法是延长我自己的资源提供者,但我无法找到如何从我的资源提供者的内部参考RESX资源。
谢谢。
编辑
下面我的答案是错误的,因为在评论中指出。 您可以通过使用反射如下得到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”叫“的ResourceKey”资源(*下* App_GlobalResources文件),当前的文化,你这样做:
HttpContext.GetGlobalResourceObject(
"MyResxFile",
"ResourceKey",
System.Threading.Thread.CurrentThread.CurrentCulture
);
好吧,它看起来与默认的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");