.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ファイルのコードを見てみよう。
|
|
グローバル・リソース・ファイルを読み込む.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ファイルのコードは以下のとおり。
|
|
ローカル・リソース・ファイルを読み込む.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ファイルのコードは以下のとおりだ。
|
|
暗黙的なローカル・リソース・ファイルを読み込む.aspxファイル(Localize.aspx) |
暗黙的なローカル・リソースを適用する場合、meta:resourcekey属性に、リソース・ファイルのキー名を指定すればよい。これによって、「キー名.プロパティ名」で指定されたリソースの内容が対応するプロパティ値として適用されるというわけだ。
ちなみに、慣例と分かりやすさを考慮して、ここではリソース・キーにサーバ・コントロールのIDと同一の値を指定しているが、異なる任意のキー名を指定しても構わない。
さて、以上を理解したら、実際にグローバル/ローカル・リソースを取得するLocalize.aspxを実行してみよう。ブラウザの言語設定によって、冒頭のような結果が得られれば成功だ。
なお、IEの場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Webフォーム 処理対象:リソース 関連TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには? 関連TIPS:[ASP.NET]国際化対応サイトをプログラムレスで実現するには? |
「.NET TIPS」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|