|
.NET TIPS
[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?
山田 祥寛
2004/08/06 |
|
|
昨今、1つのサイト(Webアプリケーション)で2つ以上の言語に対応したいというニーズは珍しくない。特にビジネス用途においては、日本語にしか対応しないというケースは少ないだろう。Webサイトの役割がますますビジネス密着型のものとなり、対象となる顧客層も拡大する中、最低でも日本語/英語、場合によっては中国語/フランス語など多言語に対応しなければならない状況は、日に日に増大している。
このような多言語対応を前提としたWebサイトの場合、言語に依存した情報をWebページ内にハード・コーディングすることは好ましくない。例えば、コード中に日本語をそのまま記述してしまったら、将来的に英語版のサイトを追加しようとした場合には、日本語部分だけを英語に置き換えたまったく同じコードをもう1つ用意しなければならないからだ。もしもさらに中国語のページが増えたとしたら、同じく中国語にのみ置き換えた同一のコードを用意しなければならない。要は、対応する言語の数だけコードも肥大化していくのだ。
しかも、これが開発時のみの苦労であればまだしも、実際のアプリケーションではリリース後に改定/バグフィックスとさまざまな修正の手が入るのが常だ。その度に対応言語の数だけコードを修正しなければならないとしたら、とんでもない開発コストがかかることになる。また、将来的に言語を追加したいような場合も同様だ。つまり、正しく多言語対応されていないサイトは、そのサイトの規模に比例して、開発コストが幾何級数的に増大していくのである。
本稿では、このような多言語サイトを構築する場合に有効な「国際化対応」の手法を紹介する。国際化対応といった場合、作業は大きく2つのステップに分類される。まず1つに、既存のアプリケーション・コードから言語依存要素(例えば、日本語文字列)を取り除くこと。そして、もう1つは、取り除いた言語依存要素を言語/国別のリソースとして外部ファイルにまとめることである。それではさっそく、具体的な手順を見ていくことにしよう。
1. Webフォームから言語依存要素を取り除く
以下に示す2つのファイル(i18n_xx.aspx)は、国際化対応前のWebフォームだ。@Pageディレクティブがファイル先頭に明示されている以外は、何ということはない静的なHTMLにすぎない。
<%@ Page ContentType="text/html" Language="VB" %>
<html>
<head>
<title>国際化対応サンプル</title>
</head>
<body>
これはサンプルです。
</body>
</html> |
|
国際化対応前の日本語のWebフォーム(i18n_ja.aspx) |
<%@ Page ContentType="text/html" Language="VB" %>
<html>
<head>
<title>Internationalization Sample</title>
</head>
<body>
This is sample.
</body>
</html> |
|
国際化対応前の英語のWebフォーム(i18n_en.aspx) |
太字で示した部分が言語依存要素だ。各ファイルの太字部分を、以下のようにLiteralコントロールで置き換えることで(=言語依存要素を取り除く)、言語的に中立な「i18n.aspx」を作成することができる。
<%@ Page ContentType="text/html" Language="VB" %>
<html>
<head>
<title><asp:Literal id="title" runat="Server" /></title>
</head>
<body>
<asp:Literal id="body" runat="Server" />
</body>
</html> |
|
言語依存要素を取り除いたWebフォームのコード(i18n.aspx) |
言語依存要素をLiteralコントロールで置き換えることで、言語的に中立なWebフォームのコードになる。 |
2. 言語依存要素を外部ファイルにする
次に、1で取り除いた言語依存要素(日本語および英語のテキスト)をリソース・ファイルとして外部ファイルにまとめてみよう。リソース・ファイル上では、「任意のキー名=値」の形式でリソースを定義することができる。
title=国際化対応サンプル
body=これはサンプルです。 |
|
言語依存要素をまとめた日本語リソース・ファイル(msg.ja-JP.txt) |
リソース・ファイル上では、「任意のキー名=値」の形式でリソースを定義することができる。 |
※リソース・ファイルに2byte文字が含まれる場合には、UTF-8で保存する必要がある。さもないと、後々に文字化けの原因となるので、注意すること。 |
title=Internationalization Sample
body=This is sample. |
|
言語依存要素をまとめた英語リソース・ファイル(msg.txt) |
リソース・ファイル上では、「任意のキー名=値」の形式でリソースを定義することができる。 |
この際、気を付けていただきたいのはリソース・ファイルの命名規則だ。リソース・ファイルのファイル名は、以下のフォーマットにのっとって命名しなければならない。
|
リソース・ファイルの命名規則 |
ファイル名は、このフォーマットにのっとって命名しなければならない。 |
ベース名とはリソース・ファイルをアプリケーションから識別するためのキー名だ。同一のリソースを含んだリソース・ファイルのベース名は互いに等しくなければならない。カルチャ名は中身のリソースがどのロケール/国に属するかを表すためのキーで、例えば「ja-JP」であれば、日本語(日本)を表すし、「en-US」であれば「英語(アメリカ合衆国)」を意味する。ASP.NETでは、実行時にクライアントのカルチャ情報とリソース・ファイルのカルチャ名とを比較することで、リソースを動的に選択するというわけだ。
もしもカルチャ名が省略された場合には、デフォルトのリソース(適切なリソースが見つからなかった場合に最終的に採用されるリソース)であると見なされる。クライアントが予期せぬカルチャに属していた場合に備え、デフォルトのリソース・ファイルは必ず用意しておくことが好ましい。
このように用意したリソース・ファイルは、そのままでは利用することができない。.NET Framework SDKに付属しているコマンドライン・ツールであるresgen.exe(リソース・ファイル生成ツール)を利用して、「.resource」ファイルを生成する必要がある。resgen.exeの実行は、コマンド・プロンプトから以下のように指定すればよい。実行の結果、msg.resource、msg.ja-JP.resourceが同一フォルダ上に生成されれば成功だ。アプリケーションに実際に配置するのは、この「.resource」ファイルになる。
> resgen msg.txt
2 リソースを 'msg.txt' から読み込みます。
リソース ファイルを書き込んでいます... 完了しました。 |
|
resgen.exe(リソース・ファイル生成ツール)の実行例 |
.NET Framework SDKに付属しているコマンドライン・ツールであるresgen.exeを使うと、「.resource」ファイルを生成できる。 |
3. リソース・ファイルを動的に読み込む
それでは、最後に中立化したWebフォーム(i18n.aspx)に、リソース・ファイルを動的に読み込む仕組みを実装してみよう。
<%@ Page ContentType="text/html" Language="C#" %>
<%@Import Namespace="System.Globalization"%>
<%@Import Namespace="System.Resources"%>
<%@Import Namespace="System.Threading"%>
<script runat="Server">
void Page_Load(Object sender, EventArgs e) {
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentUICulture =
Thread.CurrentThread.CurrentCulture;
ResourceManager objRm =
ResourceManager.CreateFileBasedResourceManager(
"msg",Server.MapPath("./"),null);
title.Text=objRm.GetString("title");
body.Text=objRm.GetString("body");
}
</script>
……後略…… |
|
言語依存要素を取り除いたWebフォームのC#コード(i18n_cs.aspx) |
<%@ Page ContentType="text/html" Language="VB" %>
<%@Import Namespace="System.Globalization"%>
<%@Import Namespace="System.Resources"%>
<%@Import Namespace="System.Threading"%>
<script runat="Server">
Sub Page_Load(sender As Object, e As EventArgs)
Thread.CurrentThread.CurrentCulture = _
CultureInfo.CreateSpecificCulture(Request.UserLanguages(0))
Thread.CurrentThread.CurrentUICulture = _
Thread.CurrentThread.CurrentCulture
Dim objRm As ResourceManager = _
ResourceManager.CreateFileBasedResourceManager( _
"msg",Server.MapPath("./"),Nothing)
title.Text=objRm.GetString("title")
body.Text=objRm.GetString("body")
End Sub
</script>
……後略…… |
|
言語依存要素を取り除いたWebフォームのVB.NETコード(i18n_vb.aspx) |
Threadクラス(System.Threading名前空間)のCurrentThread.CurrentCultureプロパティとCurrentThread.CurrentUICultureプロパティは、それぞれアプリケーション/ユーザー・インターフェイスで採用されるカルチャを定義する。ここでは、Request.UserLanguagesプロパティから取得した第1優先の言語情報をキーに、カルチャを特定している。
後は、ResourceManagerクラス(System.Resources名前空間)のCreateFileBasedResourceManagerメソッドによってリソース・ファイルを有効化するだけだ。このメソッドは、現在のカルチャ設定に基づいて、適切なリソース・ファイルを動的に選択する。CreateFileBasedResourceManagerメソッドのパラメータには、第1パラメータから順番に、リソース・ファイルのベース名、リソース・ファイルの格納場所、リソースの型(ResourceSet派生クラス)を指定することができる。デフォルトのResourceSetクラスを使用する場合には(通常はデフォルトで問題ない)、リソース型にはNothing(C#ではnull)を指定すれば良い。有効化されたリソース・ファイル内の各リソースには、ResourceManager.GetStringメソッドによってアクセスすることができる。
以上で一連の準備は完了だ。次の画面は、上記のWebフォームを実際に英語と日本語のカルチャに設定して表示したところだ。
|
英語カルチャのWebフォーム実行結果 |
多言語対応したWebフォームを英語カルチャで表示したところ。 |
|
日本語カルチャのWebフォーム実行結果 |
多言語対応したWebフォームを日本語カルチャで表示したところ。 |
IEなどのブラウザの言語設定を日本語、英語と切り替えたときに、それぞれ上の画面のように表示言語が切り替わる。なおIEの場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。
カテゴリ:Webフォーム 処理対象:リソース
使用ライブラリ:Threadクラス(System.Threading名前空間)
使用ライブラリ:ResourceManagerクラス(System.Resources名前空間) |
|
generated by
|
|