本土化。 扩展ASP.NET RESX资源提供者(Localization. Extending

2019-07-30 05:58发布

对于我的网站我有本地化的目的(本地化字符串存储在数据库中)自定义资源提供者。 它工作得很好,但我想它与默认的RESX资源提供者工作:查找本地化的字符串中的resx资源,如果不存在,然后从数据库中拉出。

但看起来,一旦更改IIS设置的全球化使用自己的资源供应商的工厂,那么默认的resx资源供应商的工厂被忽略。

我猜的解决办法是延长我自己的资源提供者,但我无法找到如何从我的资源提供者的内部参考RESX资源。

谢谢。

Answer 1:

编辑

下面我的答案是错误的,因为在评论中指出。 您可以通过使用反射如下得到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
);


Answer 2:

好吧,它看起来与默认的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");


文章来源: Localization. Extending ASP.NET Resx Resource Provider