.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)
リソース・ファイル上では、「任意のキー名=値」の形式でリソースを定義することができる。

 この際、気を付けていただきたいのはリソース・ファイルの命名規則だ。リソース・ファイルのファイル名は、以下のフォーマットにのっとって命名しなければならない。

ベース名[.カルチャ名].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の場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。End of Article

カテゴリ:Webフォーム 処理対象:リソース
使用ライブラリ:Threadクラス(System.Threading名前空間)
使用ライブラリ:ResourceManagerクラス(System.Resources名前空間)
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET AJAX]ローカリゼーション対応を行うには?
[ASP.NET]リソース・ファイル活用で国際化対応ページを構築するには?
Windowsフォームを多言語対応にするには?
[ASP.NET AJAX]ローカリゼーション対応を行うには?(アセンブリ組み込み編)
[ASP.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 記事ランキング

本日 月間