ASP.NET アプリケーション内のリソース

ASP.NET アプリケーションのサテライト アセンブリを作成した場合は、共通言語ランタイムがこれを見つけて使用できるようにするために、特定の場所に置く必要があります。サテライト アセンブリのディレクトリ構造は、ASP.NET アプリケーションおよび ASP.NET コントロールと、Windows ベースのアプリケーションでは異なります。ASP.NET アプリケーションにはアセンブリを含めることができます。しかし、ASP.NET ページからアセンブリへの変換は動的に実行されるため、アセンブリ名を前もって把握することができず、標準的なサテライト アセンブリ構成も適用されません。ここでは、ASP.NET ページおよび ASP.NET コントロールでリソースを使用する方法を説明します。

Noteメモ :

ASP.NET アプリケーションで使用するためのリソースの作成とコンパイルの手順は、Windows ベースのアプリケーション用のリソースの場合と同じです。手順の詳細については、「リソース ファイルの作成」、「リソースのパッケージ化と配置」、および「サテライト アセンブリの作成」を参照してください。

ASP.NET ページ内のリソース

ASP.NET ページの中でリソースを使用するには、まず並行メイン アセンブリを 1 つ作成して、アプリケーションのリソースを格納します。このアセンブリには、アプリケーション用の既定 (ニュートラル) のリソースが含められます。次に、アプリケーションでサポートするカルチャごとに、ローカライズしたリソースを含むサテライト アセンブリを 1 つずつ作成します。メイン アセンブリをアプリケーションの bin ディレクトリ内にインストールし、サテライト アセンブリを適切なサブディレクトリ内にインストールします。ASP.NET アプリケーションのディレクトリ構造内のどこにサテライト アセンブリを配置するかを次の図に示します。

Noteメモ :

このモデルを使用して ASP.NET アプリケーション内にリソースを配置する場合は、生じる可能性があるロック問題を回避するために、すべてのアセンブリがグローバル アセンブリ キャッシュへとシャドウ コピーされます。

ASP.NET ページに対して次の例を使用すると、適切なリソースを取得する ResourceManager が作成されます。

<%
    Dim a As Assembly = Assembly.Load("myApp")
    Dim rm As ResourceManager = New ResourceManager("myApp", a)
    Response.Write(rm.GetString("string"))
    %>
<%
    Assembly a = Assembly.Load("myApp");
    ResourceManager rm = new ResourceManager("myApp", a);
    Response.Write(rm.GetString("string"));
    %>

.aspx ページ内のリソースを取得するために使用するカルチャを明示的に指定できます。そのためには、上記の例に含まれるコード行の後ろに、指定されたカルチャから CultureInfo オブジェクトを作成し、CultureInfo の値を使用して CurrentUICulture プロパティを初期化するコードを続けます。CurrentUICulture プロパティにドイツ語の親カルチャ "de" を設定することで、ドイツ語リソースを常に強制的に取得させる例を次に示します。

Thread.CurrentThread.CurrentUICulture = new CultureInfo("de")
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");

"de" などのニュートラル カルチャを指定しても、CurrentUICulture プロパティを初期化するために使用できる CultureInfo オブジェクトを作成できますが、CurrentCulture プロパティを初期化するには特定のカルチャを指定する必要があります。CurrentCulture プロパティには、特定のカルチャ、つまりオーストリアのドイツ語と対応する "de-AT" のように、言語と地域の両方に関連付けられたカルチャを指定する必要があります。ニュートラル カルチャ "de" は言語としか関連付けられていないカルチャのため、それだけでは機能しません。CurrentCulture が要求する形式で CultureInfo オブジェクトを作成するには、CultureInfo.CreateSpecificCulture メソッドを使用します。このメソッドは、指定したニュートラル カルチャと関連付けられた特定のカルチャを表す CultureInfo オブジェクトを作成します。CultureInfo.CreateSpecificCulture メソッドを使用することで、ニュートラル カルチャ "de" と関連付けられた特定のカルチャを表す CultureInfo オブジェクトを作成し、それを使用して CurrentCulture プロパティの値を初期化する例を次に示します。

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de")
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de");

.aspx ページ内で CurrentUICulture プロパティと CurrentCulture プロパティの両方について明示的に値を設定すると便利です。CurrentCulture に "de" を設定し、次に CurrentCulture の値を使用して CurrentUICulture プロパティを初期化する例を次に示します。

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de")

Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de");

Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

CultureInfo.CreateSpecificCulture メソッドを使用すると、Web ブラウザの現在の言語を使用して .aspx ページ内の CurrentCulture プロパティを初期化することもできます。Request.UserLanguages プロパティが Web ブラウザの現在の言語を文字列として返す例を次に示します。CultureInfo.CreateSpecificCulture メソッドは、この文字列を解析してから、CurrentCulture プロパティの値を初期化するために使用できる形式で CultureInfo オブジェクトを返します。

' Set the CurrentCulture property to the culture associated with the Web
' browser's current language setting.
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0])

' It is good practice to explicitly set the CurrentUICulture property.
' Initialize the CurrentUICulture property
' with the CurrentCulture property.
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture
// Set the CurrentCulture property to the culture associated with the Web
// browser's current language setting.
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

// It is good practice to explicitly set the CurrentUICulture property.
// Initialize the CurrentUICulture property
// with the CurrentCulture property.
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

ASP.NET アプリケーション内でリソースを使用する例については、「方法 : プログラムでリソース値を取得する」チュートリアルおよび ASP.NET クイック スタートにある、ASP.NET アプリケーションのローカライズ方法を示すサンプルや、リソース ファイルの使用方法を示すサンプルを参照してください。

ASP.NET コントロール内のリソース

ASP.NET コントロールを使用して ASP.NET アプリケーションを開発した場合は、上記と同じディレクトリ構造を使用できます。コントロールの作成時には、リソースを使用してユーザーに対して各種の情報を使用するコードを記述できます。コントロールはコンパイルされるため、アセンブリを 1 つ持つことになります。したがって、そのアセンブリの中に既定リソースのセットを埋め込むことができます。コントロールが使用するリソース用のサテライト アセンブリを作成し、それをサテライト アセンブリ用のディレクトリ構造の中に配置できます。詳細については、「サテライト アセンブリの作成」を参照してください。コントロールおよびコントロールのリソースをアプリケーション ルートの bin ディレクトリ内に配置します。正しいディレクトリ構造の例を次の図に示します。

ASP.NET アプリケーションと ASP.NET コントロール ディレクトリ

メイン ASP.NET ディレクトリ、AppRoot として設定

次に示すように、myControl の複数のインスタンスを myPage.aspx に配置できます。バージョンごとに別のリソース ファイル エントリを参照するように設定できます。この例を次の ASP.NET コードで示します。

<Loc:myControl runat="server" Text="entry1" />
<Loc:myControl runat="server" Text="entry2" />

この例で、ResourceManager はアプリケーションの CultureInfo.CurrentUICulture プロパティを使用することで、取得するリソースを決定しています。

Button コントロール用の例を次に示します。変数 Text は、これから取得され、後から .aspx ページ内のコントロール内で設定されるプロパティ値を参照しています。この値は、取得するエントリの名前を判断するために使用されます。この例では、同じプロパティを使用することで、ユーザーに対して結果を表示しています。

Public Class myControl
Inherits Button

    Protected Overrides Sub Render(HtmlTextWriter writer)
        ' rm refers to the ResourceManager.
        Text = rm.GetString(Text)
        MyBase.Render(writer)
    End Sub
End Class
public class mycontrol : Button 
{
    protected override void Render(HtmlTextWriter writer) 
    {
        // rm refers to the ResourceManager.
        Text = rm.GetString(Text);      
        base.Render(writer);
    }
}

参照

関連項目

System.Globalization.CultureInfo Class

概念

アプリケーションのリソース
リソース ファイルの作成
リソースのパッケージ化と配置
サテライト アセンブリの作成

その他の技術情報

ASP.NET Web アプリケーション