.NET TIPS

[ASP.NET]国際化対応サイトをプログラムレスで実現するには?

山田 祥寛
2004/08/20

 別稿「TIPS:リソース・ファイル活用で国際化対応サイトを構築するには?」では、リソース・ファイルを利用することでアプリケーションから言語依存要素を取り除き、将来的な言語の拡張に容易に対応する手法を紹介した。しかし、この手法でリソース・ファイルから動的にリソースを取り出すに法は、定型のロジックをいちいち各ページに記述しなければならないので、いかにも煩雑だ。

 そこで、本稿ではカスタム・コントロールを利用して、プログラムレスで国際化対応ページを実現する方法を紹介する。

 カスタム・コントロールは、ユーザー・コントロールとも混同しやすいかもしれないが、まったく異なるものであるので注意すること。ユーザー・コントロールは、「既存の」サーバ・コントロールを組み合わせて構築する、いわゆる「コントロールの集合」であるのに対して、カスタム・コントロールは「1から構築する新規の」コントロールだ。見掛け上も、ユーザー・コントロールはほとんど「.aspx」ファイルと同様の構文で記述できるのに対して、カスタム・コントロールはVB.NETやC#で定義されるクラスである。

 それではさっそく、具体的なサンプルを見てみることにしよう。

1. カスタム・コントロールを記述する

 次のサンプル・コード(I18N.cs/I18N.vb)は、カスタム・コントロール「I18N」を定義するコードである。このコード中のリソース・ファイルの動的な読み込みロジックは、別稿「TIPS:リソース・ファイル活用で国際化対応サイトを構築するには?」で紹介したものとまったく同じなので、そちらを参照してほしい。

using System;
using System.Web;
using System.Web.UI;
using System.Resources;
using System.Threading;
using System.Globalization;

namespace Wings {
  public class I18N : Control {
    // プロパティ構文を利用して、Key属性を定義
    private String _key;
    public String Key {
      set {
        _key=value;
      }
      get {
        return _key;
      }
    }
    // カスタム・コントロールが動的に出力するコンテンツを生成
    // ロジックの詳細は別稿のTIPSを参照すること
    protected override void Render(HtmlTextWriter Out) {
      Thread.CurrentThread.CurrentCulture =
        CultureInfo.CreateSpecificCulture(
        Page.Request.UserLanguages[0]);
      Thread.CurrentThread.CurrentUICulture =
        Thread.CurrentThread.CurrentCulture;
      ResourceManager objRm =
        ResourceManager.CreateFileBasedResourceManager(
        "msg",Page.Server.MapPath("./"),null);
      Out.Write(objRm.GetString(_key));
    }
  }
}
リソース・ファイルを基に適切な文字列を出力するカスタム・コントロール(C#:I18N.cs)
 
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Resources
Imports System.Threading
Imports System.Globalization

Namespace Wings
  Public Class I18N : Inherits Control
    ' プロパティ構文を利用して、Key属性を定義
    Private _key As String
    Public Property Key As String
      Set
        _key=Value
      End Set
      Get
        Return _key
      End Get
    End Property
    ' カスタム・コントロールが動的に出力するコンテンツを生成
    ' ロジックの詳細は別稿のTIPSを参照すること
    Protected Overrides Sub Render(Out As HtmlTextWriter)
      Thread.CurrentThread.CurrentCulture = _
        CultureInfo.CreateSpecificCulture( _
        Page.Request.UserLanguages(0))
      Thread.CurrentThread.CurrentUICulture = _
        Thread.CurrentThread.CurrentCulture
      Dim objRm As ResourceManager = _
        ResourceManager.CreateFileBasedResourceManager( _
        "msg",Page.Server.MapPath("./"),Nothing)
      Out.Write(objRm.GetString(_key))
    End Sub
  End Class
End Namespace
リソース・ファイルを基に適切な文字列を出力するカスタム・コントロール(VB.NET:I18N.vb)

 カスタム・コントロールを定義するために必要な条件は、以下のとおりだ。

(1)System名前空間、System.Web名前空間、System.Web.UI名前空間をインポートする
 カスタム・コントロールを定義するには、最低限、System名前空間、System.Web名前空間、System.Web.UI名前空間を必要とする。もちろん、クラス内で必要なそのほかの名前空間も適宜、Importsステートメント(C#では、Usingディレクティブ)で追加すればよい。

(2)Controlクラスを継承する
 Controlクラス(System.Web.UI名前空間)は、サーバ・コントロールが持つべき基本的な機能を実装したクラスだ。すべてのサーバ・コントロールは、Controlクラスを継承しなければならない。

(3)Renderメソッドを記述する
 Controlクラスは、ページ描画の際に呼び出されるRenderメソッドを定義している。カスタム・コントロールによって生成される出力は、このRenderメソッドに記述しなければならない。

(4)属性はプロパティ構文で定義する
 カスタム・コントロールで使える属性を規定したい場合、Control派生クラス上はプロパティ構文で定義することができる。ここでは、リソースのキー名を表すKey属性を定義しておこう。

2. カスタム・コントロールを配置する

 カスタム・コントロールは、使用に先立ってコマンドラインからコンパイルを行う必要がある。コンパイルの構文は以下のとおり。

>csc /t:library /r:System.dll /r:System.Web.dll I18N.cs
C#の場合のコンパイル方法
 
>vbc /t:library /r:System.dll /r:System.Web.dll I18N.vb
VB.NETの場合のコンパイル方法

 コンパイルに成功した場合VB.NET、C#いずれにおいても、I18N.dllが生成されるはずなので、これをアプリケーション・ルート配下の「\bin」フォルダにコピーすればよい。

3. カスタム・コントロールを利用する

 これで、任意のWebフォームからカスタム・コントロールを利用することができる。

<%@ Page ContentType="text/html" %>
<%@ Register TagPrefix="wings" Namespace="Wings" Assembly="I18N" %>
<html>
<head>
<title><wings:I18N id="title" runat="Server" key="title" /></title>
</head>
<body>
<wings:I18N id="body" runat="Server" key="body" />
</body>
</html>
カスタム・コントロールを利用したWebフォーム(i18n_custom.aspx)

 カスタム・コントロールを利用する場合には、@Registerディレクティブでコントロールを有効化する必要がある。Assembly属性でカスタム・コントロールが定義されたアセンブリ名を、Namespace属性でカスタム・コントロールが属する名前空間を、そして、TagPrefix属性はカスタム・コントロールの接頭辞を、それぞれ宣言する。TagPrefix属性の値はページ内で一意でさえあれば任意に決めることができる。

 これによって、ページ内でWings名前空間に属するカスタム・コントロールを「<wings:〜 />」というタグで呼び出すことができるようになった。そのほか、id、runat属性が必須である点は、一般的なサーバ・コントロールと変わりない。

 以上で準備は完了だ。リソース・ファイルを「i18n_custom.aspx」と同一フォルダに配置したうえで、ブラウザを起動してみよう。別稿「TIPS:リソース・ファイル活用で国際化対応サイトを構築するには?」同様、ブラウザの言語設定によって表示言語が動的に切り替われば成功だ。End of Article

カテゴリ:Webフォーム 処理対象:リソース
使用キーワード:@Registerディレクティブ
使用ライブラリ:Controlクラス(System.Web.UI名前空間)
関連TIPS:リソース・ファイル活用で国際化対応サイトを構築するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]TreeViewコントロールでツリー・メニューを作成するには?
[ASP.NET]リソース・ファイル活用で国際化対応ページを構築するには?
[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?
[ASP.NET AJAX]ローカリゼーション対応を行うには?
[ASP.NET AJAX]ローカリゼーション対応を行うには?(アセンブリ組み込み編)
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間