ASP.NET Web ページのリソースの概要

Visual Studio 2010

更新 : 2007 年 11 月

さまざまな言語のユーザーに閲覧される Web ページを作成する場合は、ユーザーがそれぞれの使用言語でページを表示できるようにする必要があります。1 つの方法は、各言語でページを再作成することです。しかし、この方法は手間がかかり、エラーが発生しやすく、元のページを変更したときの保全も困難です。

ASP.NET を使用すると、ブラウザの言語設定またはユーザーの明示的な言語選択に基づいてコンテンツとその他のデータを取得するページを作成できます。コンテンツとその他のデータはリソースと呼ばれ、このようなデータは、リソース ファイルやその他のソースに格納できます。

ASP.NET Web ページでは、リソースからコントロールのプロパティ値を取得するようにコントロールを構成します。実行時には、リソース式が適切なリソース ファイルのリソースで置き換えられます。

リソース ファイルは、異なる言語に変換する文字列やイメージへのパスを格納する XML ファイルです。リソース ファイルにはキーと値のペアが含まれます。各ペアは個別のリソースです。キー名では大文字と小文字が区別されません。たとえば、リソース ファイルに、Button1 というキーと Submit という値を持つリソースを格納できます。

リソース ファイルは、言語 (英語、フランス語など) または言語とカルチャ (英語 (英国)、英語 (米国) など) ごとに個別に作成します。ローカライズされたリソース ファイルはそれぞれ、同じキーと値のペアを持ちます。ただし、ローカライズされたリソース ファイルは既定のリソース ファイルよりも少ないリソースを格納しているという点が異なります。その後、組み込みの言語フォールバック プロセスにより、ニュートラル リソースまたは既定のリソースの読み込み処理が行われます。

ASP.NET のリソース ファイルは、.resx 拡張子を持ちます。実行時に、.resx ファイルはアセンブリ (サテライト アセンブリと呼ばれることもあります) にコンパイルされます。.resx ファイルは ASP.NET Web ページと同じように動的にコンパイルされるため、リソース アセンブリを作成する必要はありません。コンパイルでは、類似した言語の複数のリソース ファイルが同じアセンブリにまとめられます。

リソース ファイルを作成するときは、まず基本の .resx ファイルを作成します。サポートする言語ごとに、同じファイル名の新しいファイルを作成します。ただし、ファイル名に言語または言語とカルチャ (カルチャ名) を含めます。カルチャ名の一覧については、CultureInfo クラスのトピックを参照してください。たとえば、次のようなファイルを作成します。

  • WebResources.resx

    基本のリソース ファイル。これは既定の (フォールバック) リソース ファイルです。

  • WebResources.es.resx

    スペイン語用のリソース ファイル。

  • WebResources.es-mx.resx

    スペイン語 (メキシコ) 用のリソース ファイル。

  • WebResources.de.resx

    ドイツ語用のリソース ファイル。

実行時に、ASP.NET は CurrentUICulture プロパティの設定に一番近いリソース ファイルを使用します。スレッドの UI カルチャは、ページの UI カルチャに従って設定されます。たとえば、現在の UI カルチャがスペイン語ならば、ASP.NET は WebResources.es.resx ファイルのコンパイル済みバージョンを使用します。現在の UI カルチャに一致するリソースがない場合、ASP.NET はリソース フォールバックを使用します。つまり、最初に特定のカルチャのリソースが検索されます。見つからない場合は、ニュートラル カルチャのリソースが検索されます。それも見つからない場合は、既定のリソース ファイルが読み込まれます。この例では、既定のリソース ファイルは WebResource.resx です。

ASP.NET では、異なるスコープを持つリソース ファイルを作成できます。グローバル リソース ファイルを作成すると、Web サイト内の任意のページやコードからリソース ファイルを読み込むことができます。また、ローカル リソース ファイルを作成して、単一の ASP.NET Web ページ (.aspx ファイル) に対するリソースを格納することもできます。

グローバル リソース ファイル

グローバル リソース ファイルは、アプリケーションのルートにある予約済みのフォルダ App_GlobalResources に配置することによって作成します。App_GlobalResources フォルダに含まれる .resx ファイルはすべて、グローバル スコープを持ちます。また、厳密に型指定されたオブジェクトが ASP.NET によって生成されるため、ユーザーはプログラムからグローバル リソースに簡単にアクセスできます。

ローカル リソース ファイル

ローカル リソース ファイルは、単一の ASP.NET ページまたはユーザー コントロール (ファイル名拡張子が .aspx、.ascx、または .master の ASP.NET ページ) に対してのみ適用されるリソース ファイルです。ローカル リソース ファイルは、App_LocalResources という予約済みの名前を持つフォルダに配置します。ルートにある App_GlobalResources フォルダとは異なり、App_LocalResources フォルダはアプリケーション内の任意のフォルダに配置できます。一連のリソース ファイルは、リソース ファイルの名前を使用することで特定の Web ページに関連付けます。

たとえば、App_LocalResources フォルダ内に Default.aspx という名前のページがある場合に、次のようなファイルを作成します。

  • Default.aspx.resx。一致する言語が見つからない場合の既定のローカル リソース ファイル (フォールバック リソース ファイル)。

  • Default.aspx.es.resx。カルチャ情報がないスペイン語用のリソース ファイル。

  • Default.aspx.es-mx.resx。スペイン語 (メキシコ) 用のリソース ファイル。

  • Default.aspx.fr.resx。カルチャ情報がないフランス語用のリソース ファイル。

ファイルの基本名はページ ファイル名と同じで、その後に言語とカルチャ名、最後に .resx 拡張子を付けます。カルチャ名の一覧については、「CultureInfo」を参照してください。

クライアント スクリプト リソースのローカライズ

ASP.NET AJAX クライアント スクリプトのローカリゼーション サポートは、ASP.NET 2.0 ローカリゼーション モデルの基盤に基づいています。このモデルでは、スクリプト ファイルとローカライズされたスクリプト リソースをアセンブリのハブ アンド スポーク構造 (サテライト アセンブリ) に埋め込みます。これで、特定の言語および地域に対して埋め込まれたクライアント スクリプトやリソースを選択的に使用できます。このモデルにより、単一のコード ベースで複数のカルチャをサポートできます。また、ディスク上の .js ファイルとして提供される、ローカライズされたスクリプト ファイルもサポートされます。ASP.NET では、特定の言語および地域に向けてローカライズされたクライアント スクリプトとリソースを自動的に提供できます。

詳細については、次のトピックを参照してください。

グローバル リソース ファイルとローカル リソース ファイルの使い分け

Web アプリケーションでは、グローバル リソース ファイルとローカル リソース ファイルを任意に組み合わせて使用できます。一般に、ページ間でリソースを共有する場合は、グローバル リソース ファイルにリソースを追加します。また、グローバル リソース ファイル内のリソースは、プログラムでファイルにアクセスする場合のために厳密に型指定されています。

しかし、ローカライズされたリソースをすべてグローバル リソース ファイルに格納すると、ファイルのサイズが大きくなる可能性があります。また、複数の開発者が単一のリソース ファイル内の異なるページを使用する場合、グローバル リソース ファイルの管理は難しくなります。

ローカル リソース ファイルを使用すると、単一の ASP.NET Web ページに対するリソースを管理しやすくなります。しかし、ページ間でリソースを共有することはできません。また、多言語にローカライズする必要があるページが多数ある場合は、ローカル リソース ファイルを大量に作成する必要が生じます。多くのフォルダと言語を含む大規模なサイトでは、ローカル リソースの追加によって、アプリケーション ドメイン内のアセンブリの数が急速に増加する可能性があります。

ローカルとグローバルのいずれの場合も、既定のリソース ファイルを変更すると、リソースがコンパイルされ、ASP.NET アプリケーションが再起動されます。これにより、サイト全体のパフォーマンスが影響を受ける場合があります。サテライト リソース ファイルを追加した場合は、リソースの再コンパイルは実行されませんが、ASP.NET アプリケーションは再起動されます。

ms227427.alert_note(ja-jp,VS.100).gifメモ :

リンクされたリソースは、グローバル リソース ファイルでのみサポートされます。

リソース ファイルを作成したら、ASP.NET Web ページで使用できます。通常、リソースは、ページ上のコントロールのプロパティ値を読み込むために使用します。たとえば、Button コントロールの Text プロパティを、特定の文字列にハード コーディングする代わりにリソースを使用して設定できます。

リソースを使用してコントロールのプロパティ値を設定するには、次のように、暗黙のローカリゼーションまたは明示的なローカリゼーションを使用します。

  • 暗黙のローカリゼーションでは、ローカル リソースを使用し、コントロールのプロパティを一致するリソースに自動的に設定します。

  • 明示的なローカリゼーションでは、リソース式を使用して、コントロールのプロパティをローカル リソース ファイルまたはグローバル リソース ファイル内の特定のリソースに設定します。

ローカル リソースを使用した暗黙のローカリゼーション

特定のページに対してローカル リソース ファイルを作成済みの場合は、暗黙のローカリゼーションにより、そのリソース ファイルからコントロールのプロパティ値を読み込むことができます。暗黙のローカリゼーションでは、リソース ファイルが ASP.NET によって読み取られ、プロパティ値と照合されます。

暗黙のローカリゼーションを使用するには、ローカル リソース ファイル内のリソースに、次のパターンの名前付け規則を使用する必要があります。

キー.プロパティ

たとえば、Button1 という名前の Button コントロールのリソースを作成する場合、ローカル リソース ファイル内で次のようなキーと値のペアを作成します。

Button1.Text
Button1.BackColor
Label1.Text

Key には任意の名前を使用できますが、Property はローカライズするコントロールのプロパティの名前と同じである必要があります。

ページでは、コントロールのマークアップで特殊な meta 属性を使用して、暗黙のローカリゼーションを指定します。ローカライズするプロパティを明示的に指定する必要はありません。暗黙のローカリゼーション用に構成された Button コントロールは次のようになります。

<asp:Button ID="Button1" runat="server" Text="DefaultText" 
    meta:resourcekey="Button1" />

resourcekey 値は、対応するリソース ファイル内のキーと一致しています。実行時に、ASP.NET はコントロールのラベルを resourcekey として使用して、リソースをコントロールのプロパティと照合します。リソース ファイルでプロパティ値が定義されていれば、ASP.NET はプロパティをリソースの値で置き換えます。

明示的なローカリゼーション

リソース式による明示的なローカリゼーションを使用することもできます。暗黙のローカリゼーションとは異なり、設定する各プロパティに対してリソース式を使用する必要があります。

グローバル リソース ファイルから Text プロパティを設定するように構成された Button コントロールは、次のようになります。

<asp:Button ID="Button1" runat="server" 
    Text="<%$ Resources:WebResources, Button1Caption %>" />

リソース式は次のような形式をとります。ここで、リソースがグローバル リソースで ResourceID が必須である場合を除いて、Class は省略可能です。

<%$Resources:Class,ResourceID%>

Class 値は、グローバル リソースを使用するときに使用するリソース ファイルを識別します。.resx ファイルがコンパイルされる際、拡張子を除いた基本ファイル名が、結果として生成されるアセンブリのクラス名として明示的に使用されます。現在のページ名と一致するローカル リソース ファイルのリソースを使用する場合は、クラス名を指定する必要はありません。これは、ページ クラスとリソース クラスの照合が ASP.NET によって行われるためです。

ResourceID 値は、読み込むリソースの ID です。上の例では、ボタンの Text プロパティが、グローバル リソース ファイル WebResources.resx (または適切なローカライズ済みバージョン) から読み込まれます。このファイル内で、ASP.NET は、識別子 Button1Caption を持つリソースとページ自体の値を使用します。ページのプロパティを設定するには、@ Page ディレクティブでリソース式を使用します。

コントロールに明示的なリソース式または暗黙的なリソース式を指定できますが、両方を同時に指定することはできません。次の Button コントロールの宣言構文では、パーサー エラーが発生します。

<asp:Button ID="Button1" 
            runat="server" 
            meta:resourcekey="Button1Resource1"
            Text="<%$ Resources:WebResources, Button1Caption %>" />

この例では、暗黙的なローカル リソース ファイル (現在のページ名に一致するファイル) だけでなく、WebResources という明示的なリソース ファイルも指定されています。このコントロールのパーサー エラーを回避するには、どちらかのリソース式を削除します。

静的テキストのローカライズ

ページに静的テキストが含まれる場合は、それを Localize コントロールに含めた後で、明示的なローカリゼーションを使用して静的テキストを設定することにより、ASP.NET ローカリゼーションを使用できます。Localize コントロールはマークアップをレンダリングしません。これは、ローカライズされたテキストのプレースホルダとしてのみ機能します。Localize コントロールは、プロパティ グリッドだけでなく、デザイン ビューでも編集できます。実行時には、Localize コントロールは Literal コントロールとして扱われます。たとえば、ページに次のようなコードを含めます。

<h1>
  <asp:Localize runat=server 
    ID="WelcomeMessage" 
    Text="Welcome!" meta:resourcekey="LiteralResource1" />
</h1>
<br />
<br />
<asp:Localize runat="server"
    ID="NameCaption"
    Text="Name: " meta:resourcekey="LiteralResource2" />
<asp:TextBox runat="server" ID="TextBox1" 
    meta:resourcekey="TextBox1Resource1" />
ms227427.alert_security(ja-jp,VS.100).gifセキュリティに関するメモ :

この例には、ユーザー入力を受け付けるテキスト ボックスがあるため、セキュリティ上の脅威になる可能性があります。既定では、ASP.NET Web ページは、ユーザー入力にスクリプトまたは HTML 要素が含まれていないことを検証します。詳細については、「スクリプトによる攻略の概要」を参照してください。

テンプレートの暗黙的なローカリゼーション

DataListGridViewWizard など、template 宣言されたコントロールでは、親コントロールの暗黙的なリソース式によってテンプレートのスタイル プロパティにアクセスすることでローカライズします。テンプレート自体に暗黙的なリソース式を使用することはできません。

テンプレート プロパティの値をローカライズするには、テンプレートが所属するコントロールの meta 属性とリソース キーを使用します。次に、リソース ファイルの Property.Subproperty 構文または Property-Subproperty 構文を使用します。Wizard コントロールの宣言構文の例を以下に示します。

<asp:Wizard ID="Wizard1" 
    runat="server" 
    meta:resourcekey="Wizard1Resource1">
  <NavigationStyle 
    BorderWidth="<%$ resources:navBorderWidth %>"/>
  <WizardSteps>
    <asp:WizardStep ID="WizardStep1" 
      runat="server" 
      Title="Step 1" 
      meta:resourcekey="WizardStep1Resource1">
    </asp:WizardStep>
  </WizardSteps>
</asp:Wizard>

前の例では、ローカル リソース ファイルで次のキーと値のペアを使用できます。

Wizard1Resource1.NavigationStyle.BackColor, Red
navborderWidth, 5

または、次のキーと値のペアも使用できます。

Wizard1Resource1.NavigationStyle-BackColor, Red
navborderWidth, 5

前の例では、Wizard コントロールの NavigationStyle プロパティに明示的なリソース式を使用できます。明示的なリソース式では、Class 名を省略するため、ローカル リソース ファイルのリソースが使用されます。

テンプレート宣言されたサーバー コントロールの詳細については、「ASP.NET Web サーバー コントロール テンプレート」を参照してください。

ページを実行するときに、ASP.NET はページの現在の UICulture の設定に最も近いバージョンのリソース ファイルを使用します。一致するリソースがない場合、ASP.NET はリソース フォールバックを使用してリソースを取得します。たとえば、Default.aspx ページを実行しようとしていて、現在の UICulture プロパティが es (スペイン語) に設定されている場合、ASP.NET はローカル リソース ファイル Default.aspx.es.resx のコンパイル済みバージョンを使用します。

ASP.NET は、ページの UICulture プロパティと Culture プロパティを、ブラウザから渡される言語とカルチャの値に設定できます。UICulture プロパティと Culture プロパティを、宣言またはコードのいずれかによって明示的に設定することもできます。また、Web.config ファイルで、宣言によってこれらの値を設定することもできます。詳細については、「方法 : ASP.NET Web ページのグローバリゼーション用のカルチャおよび UI カルチャを設定する」を参照してください。

ms227427.alert_note(ja-jp,VS.100).gifメモ :

言語とカルチャ情報の設定は、ブラウザの設定だけに依存しないでください。これは、ユーザーが自分のコンピュータ以外でブラウザを使用する可能性があるためです。また、多くの場合、ブラウザは言語だけをやり取りし、特定のカルチャのやり取りは行いません。その場合、サーバーでは、データの書式設定のために特定のカルチャを推測する必要があります。推奨される方法は、ユーザーに明示的に言語を選択させる方法です。

リソース式を使用してマークアップ内でリソースの値を設定する方法以外に、プログラムでリソースの値を取得することもできます。プログラムによる方法は、デザイン時にリソースの値が不明である場合や、リソースの値を実行時に取得される値に設定する場合に使用します。詳細については、「方法 : プログラムでリソース値を取得する」を参照してください。

表示: