4

私のWebサイトには、ローカリゼーション用のカスタムリソースプロバイダーがあります(ローカライズされた文字列はデータベースに保存されます)。正常に動作しますが、デフォルトの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"));

GetGlobalResourceObjectメソッドとGetLocalResourceObjectメソッド(HttpContextクラスの一部)を使用して、カスタムローカリゼーションクラス内の.ResXファイルを操作できます。

たとえば、「MyResxFile.resx」(* App_GlobalResources *の下)から「ResourceKey」というリソースを取得するには、現在のカルチャに対して次のように使用します。

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

meta:resourcekey暗黙のローカリゼーション式( )はローカライズされないため、デフォルトのresXリソースプロバイダーを使用してカスタムリソースプロバイダーを拡張しても、問題は完全には解決されないようです。

ここで見つけた可能な解決策は、カスタム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 に答える