.NET TIPS

[ASP.NET]リソース・ファイル活用で国際化対応ページを構築するには?[2.0のみ、C#、VB]

山田 祥寛
2006/05/12

 「TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?」で紹介したように、ASP.NETでは国際化対応アプリケーションを構築するために、リソースという仕組みを提供している。これによって、言語依存要素をアプリケーション・コードから切り離し、ユーザーの対応言語に応じて動的に表示を切り替えられるというわけだ。もちろん、新たな言語に対応しなければならなくなった場合にも、新たな言語用のリソース・ファイルを作成すればよいだけなので、アプリケーション・コードには一切影響を与えずに済む。

 もっとも、ASP.NET 1.xの国際化対応機能は、まだ不十分な点も多かった。というのも、リソース・ファイルの内容を出力するために少なからぬコードを記述しなければならなかったのだ。もしもこのような定型的な処理のためにコードを記述するのを嫌うならば、「TIPS:[ASP.NET]国際化対応サイトをプログラムレスで実現するには?」で紹介しているように、自前でカスタム・コントロールなどを用意する必要があった。

 しかし、ASP.NET 2.0ではリソース・ファイルをWebフォーム上で引用するための標準的な方法が提供されている。これによって、コードを記述したり、カスタム・コントロールを用意したりする必要がなくなる。

 それではさっそく、具体的ないくつかのアプローチ手順を見てみることにしよう。ここで紹介するサンプル・プログラムはとても単純なものだ。Internet Explorer(以後IE)などブラウザの言語設定を日本語、英語と切り替えたときに、それぞれ下図のように表示言語も動的に変更する。

英語カルチャのWebフォームの実行結果
多言語対応したWebフォームを英語カルチャで表示したところ。
 
日本語カルチャのWebフォームの実行結果
多言語対応したWebフォームを日本語カルチャで表示したところ。

●グローバル・リソースを利用する方法

 グローバル・リソースとは、アプリケーション共通で利用可能なリソースのことだ。仮想ディレクトリ直下のApp_GlobalResourcesフォルダに配置する必要がある。ここでは、App_GlobalResourcesフォルダの配下に、以下のようなリソース・ファイル(.resxファイル)を配置してみよう。

ファイル名 キー名
DotNetTips.resx Message Good Night
DotNetTips.ja.resx Message こんばんは
App_GlobalResourcesフォルダに配置するリソース・ファイルの内容

 Visual Studio 2005(以降、VS 2005)では、専用のデータシート上でリソース・ファイルを編集することができる。ソリューション・エクスプローラ上のプロジェクト項目からコンテキスト・メニューの[追加]−[新しい項目の追加]を選択し、新規「リソース ファイル」を作成すると、以下のような入力用シートが開くはずだ。それぞれのリソース・ファイルには、上の表に従ってMessageというキーの文字列リソースを作成しておこう。

リソース・ファイルの編集画面
リソース・ファイルで管理するデータは、このようなデータシート上から簡単に編集できる。

 ASP.NET 2.0でリソース・ファイルを利用する場合には、以下の命名規則に従う必要があるので要注意。

ベース名[.カルチャ名].resx

 ベース名とはリソース・ファイルをアプリケーションから識別するためのキー名のこと。同一のリソースを含んだリソース・ファイルのベース名は互いに等しくなければならない。

 カルチャ名は中身のリソースがどのロケール/国に属するかを表すためのキーで、例えば「ja-JP」であれば、「日本語(日本)」を表すし、「en-US」であれば「英語(アメリカ合衆国)」を意味する。ASP.NETでは、実行時にクライアントのカルチャ情報とリソース・ファイルのカルチャ名とを比較することで、リソースを動的に選択するというわけだ。

 ちなみに、カルチャ名が省略されたリソース・ファイルはデフォルトのリソースと見なされる。デフォルトのリソース・ファイルは、クライアントのカルチャ情報に該当するリソース・ファイルが存在しない場合に、最終的に適用されるリソースだ。

 さて、リソースの用意ができたところで、次に、App_GlobalResourcesフォルダに配置したリソース・ファイルの内容を取得する.aspxファイルのコードを見てみよう。

<%@ Page Culture="auto" UICulture="auto" %>
  ……中略 ……
<asp:Literal ID="ltrGlobal" runat="server" Mode="Encode"
  Text="<%$ Resources:DotNetTips, Message %>" />
グローバル・リソース・ファイルを読み込む.aspxファイル(Localize.aspx)

 ここで注目していただきたいのは、LiteralコントロールのTextプロパティだ。グローバル・リソース内で定義されたリソースにアクセスするには、

「<%$ Resources:リソース・ファイルのベース名, キー名 %>」

のように記述すればよい。「<%$〜%>」はASP.NET 2.0で新たに追加された「式」構文で、リソース・ファイルをはじめ、アプリケーション設定やデータベース接続文字列などにアクセスする際に利用できる*

* 式の一般的な構文は、「<%$ Prefix:Key %>」。リソース・ファイルにアクセスする場合にはPrefixの部分として“Resources”を指定するが、例えば、アプリケーション設定にアクセスする場合には“AppSettings”を、データベース接続文字列にアクセスする場合には“ConnectionStrings”を指定すればよい。

 また、リソース・ファイルを利用する場合には、@PageディレクティブにCulture属性およびUICulture属性を指定しておく必要がある。

 Culture属性、UICulture属性は、それぞれアプリケーション、ユーザー・インターフェイスで採用されるカルチャを定義するものだ。値として“auto”を設定した場合には、ASP.NETがリクエスト情報に含まれるAccept-Languageヘッダの内容から判断して、自動的にカルチャを特定してくれる。これは、後述するローカル・リソース・ファイルを利用する場合も同様だ。

●ローカル・リソースを利用する方法

 以上のように、グローバル・リソースは、アプリケーション共通で利用するリソースを一元的に管理する場合に有効な手段だ。しかし、ページ固有のリソースまでもグローバル・リソースとして管理することは、リソース・ファイルの肥大化を招く原因になる。また、複数の人間が開発に携わっている場合、複数ページのリソースを1つのファイルで管理することは、保守性という観点からも好ましくない。

 そこで登場するのが、ローカル・リソースだ。ローカル・リソースとは、指定された特定のページ(「.aspx」「.ascx」「.master」などのファイル)でのみ利用可能なリソースのこと。ローカル・リソースを利用することで、リソースをページ単位で管理することができる。

 ローカル・リソースを利用する場合の注意点は、以下の2点だ。

(1)App_LocalResourcesフォルダに配置すること

 ローカル・リソースは「App_LocalResources」フォルダに配置する必要がある。App_LocalResourcesフォルダは、App_GlobalResourcesフォルダとは異なり、仮想ディレクトリ配下の任意のフォルダに配置することができる。例えば、リソースを適用する.aspxファイルが「~/basic」フォルダに配置されているならば、対応するリソースも同列のフォルダ内――つまり、「~/basic/App_LocalResources」フォルダに配置する必要がある。

(2)リソース・ファイル名は「元のファイル名[.カルチャ名].resx」

 グローバル・リソースのファイル名はベース名として任意の名前を設定することが可能であったが、ローカル・リソースではベース名でもってページとの関連付けを表す必要がある。つまり、リソースを適用する.aspxファイルが「Localize.aspx」であるならば、そのローカル・リソース・ファイルには「Localize.aspx.resx」「Localize.aspx.ja.resx」のような名前を付ける必要がある。

 ここでは、仮想ディレクトリ直下にLocalize.aspxがあるものと仮定して、同じく仮想ディレクトリ直下のApp_LocalResourcesフォルダに、以下のような内容のリソース・ファイル(.resxファイル)を配置してみよう。

ファイル名 キー名
Localize.aspx.resx Message Hello
Localize.aspx.ja.resx Message こんにちは
App_LocalResourcesフォルダに配置するリソース・ファイルの内容

 App_LocalResourcesフォルダに配置したリソース・ファイルの内容を取得する.aspxファイルのコードは以下のとおり。

<%@ Page Culture="auto" UICulture="auto" %>
  ……中略……
<asp:Literal ID="ltrMessage" runat="server" Mode="Encode"
  Text="<%$ Resources:Message %>" />
ローカル・リソース・ファイルを読み込む.aspxファイル(Localize.aspx)

 上述したように、ローカル・リソースではリソースの関連付けがベース名で表現できるので、

「<%$ Resources:キー名 %>」

とよりシンプルな構文でアクセスすることが可能だ。当然のことながら、別のページに関連付けられたローカル・リソースにアクセスすることはできないので、注意してほしい。

●暗黙的なローカル・リソースを利用する方法

 式構文によってシンプルにリソース・ファイルにアクセスできるとはいえ、サーバ・コントロール上の個々のプロパティ1つ1つに対して式構文を記述するのは冗長で、スペリング・ミスの一因ともなり得る。それはWebフォーム上のサーバ・コントロールが多くなり、かつ、国際化すべきプロパティが多い場合にはなおさらだろう。

 そこでASP.NET 2.0では、ローカル・リソースを<暗黙的に>サーバ・コントロールの各プロパティに関連付けるための方法を提供している。暗黙的なローカル・リソースを利用するために、まずはApp_LocalResourcesフォルダの配下に、以下のような内容のリソース・ファイル(.resxファイル)を配置してみよう。

ファイル名 キー名
Localize.aspx.resx ltrMeta.Text Good Morning
Localize.aspx.ja.resx ltrMeta.Text おはようございます
App_LocalResourcesフォルダに配置するリソース・ファイルの内容

 ここでポイントとなるのは、キー名の部分だ。暗黙的なローカル・リソースを利用する場合、リソース・キーは「任意のキー名.プロパティ名」の形式とする必要がある。

 上記のリソースを取得する.aspxファイルのコードは以下のとおりだ。

<%@ Page Culture="auto" UICulture="auto" %>
  ……中略 ……
<asp:Literal ID="ltrMeta" runat="server" Mode="Encode"
  meta:resourcekey="ltrMeta" />
暗黙的なローカル・リソース・ファイルを読み込む.aspxファイル(Localize.aspx)

 暗黙的なローカル・リソースを適用する場合、meta:resourcekey属性に、リソース・ファイルのキー名を指定すればよい。これによって、「キー名.プロパティ名」で指定されたリソースの内容が対応するプロパティ値として適用されるというわけだ。

 ちなみに、慣例と分かりやすさを考慮して、ここではリソース・キーにサーバ・コントロールのIDと同一の値を指定しているが、異なる任意のキー名を指定しても構わない。

 さて、以上を理解したら、実際にグローバル/ローカル・リソースを取得するLocalize.aspxを実行してみよう。ブラウザの言語設定によって、冒頭のような結果が得られれば成功だ。

 なお、IEの場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:リソース
関連TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?
関連TIPS:[ASP.NET]国際化対応サイトをプログラムレスで実現するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET AJAX]ローカリゼーション対応を行うには?
[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?
[ASP.NET]サイトマップ・ファイルをローカライズするには?
[ASP.NET AJAX]ローカリゼーション対応を行うには?(アセンブリ組み込み編)
VS.NETで画像などのリソースを利用するには?(読込編)
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間