.NET TIPS

[ASP.NET AJAX]ローカリゼーション対応を行うには?(アセンブリ組み込み編)[2.0、3.0、3.5、C#、VB]

山田 祥寛
2008/05/22

 「TIPS:[ASP.NET AJAX]ローカリゼーション対応を行うには?」では、ファイル・システム上に配置したJavaScriptコードをローカライズする方法について紹介した。もちろん、これはこれで有効なアプローチであるが、カスタムのコントロールを開発するようなケースではJavaScriptのコードはアセンブリに組み込むのが一般的だ。そして、そのようなケースでは前掲のTIPSで紹介したアプローチは利用できない。

 そこで本稿では、アセンブリに組み込まれたJavaScriptのコードにリソースを適用し、ローカライズする方法について紹介する。

 なお、ここで紹介するサンプルでは、別記事「MS AJAX LibでAJAX対応コントロールを開発しよう(前編)」で紹介したDialogButtonコントロール(DialogButtonExtender)を修正し、リソースから取得したメッセージをダイアログ表示するものとする。JavaScript組み込みコントロールそのものの作成手順については本稿では割愛するので、元の記事の方を参照いただきたい。

言語設定が「日本語」のクライアントで[表示]ボタンをクリック
言語設定が「英語」のクライアントで[表示]ボタンをクリック
[表示]ボタンをクリックすると、リソースから取得したメッセージをダイアログ表示(クライアントの言語設定によって表示言語を切り替え)

 それではさっそく、具体的な手順を見ていくことにしよう。なお、本サンプルを動作させるに当たっては、「TIPS:[ASP.NET AJAX]ASP.NET AJAX Control Toolkitを利用するには?」で紹介した手順に従って、Control Toolkitを利用可能な状態にしておく必要がある。

[注意]グローバリゼーション機能を有効化

本サンプルを動作させるには、アプリケーション構成ファイル(Web.config)に対して、カルチャに関する設定を行っておく必要がある。具体的な記述と設定の意味については、「TIPS:[ASP.NET AJAX]グローバリゼーション対応を行うには?」の手順1を参照していただきたい。

1. リソース・ファイルを追加する

 アセンブリにリソースを組み込む場合には、(JavaScriptコードではなく)通常の.resxファイルとしてリソースを定義すればよい。ここでは、別記事で作成したMyAjaxLibプロジェクト(ASP.NET AJAX Control Project)の直下にリソース・ファイルとして「Greeting.resx」「Greeting.ja-JP.resx」「Greeting.de.resx」を追加する。

 リソース・ファイルの追加/編集方法については、「TIPS:[ASP.NET]リソース・ファイル活用で国際化対応ページを構築するには?」をご参照いただくとして、ここでは以下の表の要領でそれぞれのリソース・ファイルにそれぞれのリソースを定義しておこう。

ファイル名 キー名
Greeting.resx morning Good Morning
hello Hello
night Good Night
Greeting.ja-JP.resx morning おはようございます
hello こんにちは
night おやすみなさい
Greeting.de.resx morning Guten Morgen
hello Guten Tag
night Gute Nacht
リソース・ファイルへの定義内容

2. JavaScriptコードとリソースとを関連付ける

 JavaScriptコードと参照するリソース・ファイルを関連付けるには、ExtenderクラスにScriptResource属性を宣言すればよい。この例であれば、具体的にはDialogButtonExtenderクラスに対して、以下の属性のコード(太字部分)を追加する。

[assembly: System.Web.UI.WebResource(
  "MyAjaxLibCs.DialogButtonBehavior.js", "text/javascript")]
[assembly: System.Web.UI.ScriptResource(
  "MyAjaxLib.DialogButtonBehavior.js",
  "MyAjaxLib.Greeting", "MyRes")]
<Assembly: System.Web.UI.WebResource("MyAjaxLib.DialogButtonBehavior.js", "text/javascript")>
<Assembly: System.Web.UI.ScriptResource("MyAjaxLib.DialogButtonBehavior.js", "MyAjaxLib.Greeting", "MyRes")>
リソース・ファイルの関連付けを行うコード(上:DialogButtonExtender.cs、下:DialogButtonExtender.vb)

 ScriptResource属性(System.Web.UI名前空間)は、JavaScriptから参照するリソース・ファイルを関連付けるための属性である。ScriptResource属性の一般的な構文は、以下のとおり。

[assembly: System.Web.UI.ScriptResource(
  "スクリプトのパス", "リソースのパス", "リソースの型名")]
<Assembly: System.Web.UI.ScriptResource("スクリプトのパス", "リソースのパス", "リソースの型名")>
ScriptResource属性の構文(上:C#、下:VB)

 スクリプト/リソースのパスには、それぞれ関連付けるスクリプト・ファイル、リソース・ファイルのパスを「プロジェクト名.フォルダ名.ファイル名」の形式で指定すればよい。また、リソースの型名はJavaScript側からリソース個々のキーにアクセスするためのプレフィックスとなる。例えば、ここでは“MyRes”と指定しているので、リソース・ファイル内のmorningキーにアクセスするには、「MyRes.morning」とすればよい。

3. Behaviorオブジェクトからリソースを参照する

 これでリソースを利用するための準備は完了だ。あとは、Behaviorオブジェクトから実際にリソースを参照してみよう。ここでは、ターゲット要素がクリックされたときに実行される_onClickイベント・ハンドラを以下(太字部分)のように書き換えるものとする。

_onClick : function(e) {
  window.alert(MyRes.morning);
  var h = this.get_events().getHandler('Closed');
  ……中略……
}
ターゲット要素がクリックされたときに実行される_onClickイベント・ハンドラ

 先ほども述べたように、リソースの内容を参照するには、「リソースの型名.キー名」で記述すればよい。

4. Extenderコントロールの動作を確認する

 Extenderコントロールの準備ができたら、別記事の要領でビルドを済ませる。エクスプローラからプロジェクト配下の「/Bin/Debug」(または「/Bin/Release」)フォルダを確認すると、「プロジェクト名.dll」(ここではMyAjaxLib.dll)、および、リソースごとのフォルダ(ここでは「de」「ja-JP」フォルダ)ができているはずなので、これをWebサイト配下の「/Bin」フォルダに配置する。

 あとは、別記事で作成済みのDialogButtonServer.aspxに配置してあるScriptManagerコントロールのEnableScriptLocalizationプロパティをtrueに設定するだけだ。

 以上を理解したら、実際にDialogButtonServer.aspxを実行してみよう。ブラウザの言語設定によって、冒頭のような結果が得られれば成功だ。なお、IEの場合の言語設定は、メニューバーの[ツール]−[インターネット オプション]を選択して[インターネット オプション]ダイアログを表示し、そのダイアログの[全般]タブにある[言語]ボタンから変更できる。

 なお、参考までに、出力されているJavaScriptのコードの中身も確認してみよう(実際に出力されるコードは、例えば「/MsAjaxLib/ScriptResource.axd?d=IM4MYW6yp8fc3lFQB8BivX_3gPXIw9lh32h9GILIYoqktNZ4t1-K2ii2LnDi2eHO0&amp;t=633428601391562500」のようなパスで参照できる。このパスは、ブラウザの[ソースの表示]で確認してほしい)。

……前略……
MyAjaxLib.DialogButtonBehavior.registerClass(
  'MyAjaxLib.DialogButtonBehavior',
  AjaxControlToolkit.BehaviorBase);

MyRes = {
"hello":"こんにちは",
"night":"おやすみなさい",
"morning":"おはようございます"
};

if (typeof(Sys)!=='undefined')
  Sys.Application.notifyScriptLoaded();
実際に出力されたJavaScriptのコード

 このリストのように、もともと定義されたBehaviorオブジェクトのコード末尾に、リソース定義のためのオブジェクト・リテラル(太字部分)が追加されていることが確認できるはずだ。このように、アセンブリに組み込まれたリソースは、Behaviorオブジェクトに対してオブジェクト定義として追加されることで認識されるわけだ。End of Article

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:ASP.NET AJAX
関連TIPS:[ASP.NET AJAX]ローカリゼーション対応を行うには?
関連TIPS:[ASP.NET AJAX]ASP.NET AJAX Control Toolkitを利用するには?
関連TIPS:[ASP.NET AJAX]グローバリゼーション対応を行うには?
関連TIPS:[ASP.NET]リソース・ファイル活用で国際化対応ページを構築するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET AJAX]ローカリゼーション対応を行うには?
[ASP.NET]リソース・ファイル活用で国際化対応ページを構築するには?
文字列リソースを活用するには?
VS.NETで画像などのリソースを利用するには?(読込編)
[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 記事ランキング

本日 月間