ResourceManager と ASP.NET
ResourceManager には、ASP.NET を使用する Web アプリケーションからもアクセスできます。この小さなアプリケーションのコードは WorldDocs サブディレクトリにあり、重要なルーチンは Global.asax と Default.aspx という 2 つのファイルに含まれています。
WorldDocs アプリケーションに最初のユーザー要求が送信されると、Global.asax が読み込まれ、Application_Onstart サブルーチンが実行されます。前述のサンプルと同様に、このサブルーチンは、静的な CreateFileBasedResourceManager メソッドを使用してリソース マネージャを作成し、アセンブリからではなくファイルからテキスト ベースのリソースを読み込みます (前のサンプル プログラムでも同じ処理が行われています)。次に、ResourceManager が Application の RM 変数に割り当てられます。ユーザー要求が送信されるたびに、Application_BeginRequest サブルーチンも実行されます。このサブルーチンでは、ユーザーのカルチャ (Request.UserLanguages プロパティで指定されるカルチャ) が Web サーバーで現在実行中のスレッドに割り当てられます。このコードを次に示します。
リスト 5. ResourceManager による名前付きリソースの処理 (Global.asax)
void Application_OnStart() {
Application["RM"] =
ResourceManager.CreateFileBasedResourceManager
("mytext", Server.MapPath("resources")
+ Path.DirectorySeparatorChar, null);
}
void Application_BeginRequest(Object sender, EventArgs args) {
// For each request initialize the culture values with
// the user language as specified by the browser.
try {
Thread.CurrentThread.CurrentCulture = new
CultureInfo(Request.UserLanguages[0]);
}
catch(Exception) {
// provide fallback for not supported languages.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
}
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
リソースを動的に割り当てる処理は、ページが読み込まれるときに行われます。この例では、Default.aspx の Page_Init サブルーチンと Page_Load サブルーチンで処理します。Page_Init は、ページ スコープの ResourceManager を作成し、その ResourceManager に Application の RM 変数を割り当てます。ユーザーが言語選択を変更するたび、Page_Load サブルーチンは、サーバーに自動的にポストバックすることでカルチャを動的に変更します。このコードを次に示します。
リスト 6. ResourceManager による名前付きリソースの処理 (Default.aspx)
void Page_Init(Object sender, EventArgs args) {
// Get the ResourceManager from the Application object.
rm = (ResourceManager) Application["RM"];
...
}
void Page_Load(Object sender, EventArgs args) {
String SelectedCulture = MyUICulture.SelectedItem.Text;
if(! SelectedCulture.StartsWith("Choose")) {
// If another culture was selected, use that instead.
Thread.CurrentThread.CurrentCulture = new
CultureInfo(SelectedCulture);
Thread.CurrentThread.CurrentUICulture = new
CultureInfo(SelectedCulture);
}
}
最後に説明するコードは、イメージ リソースと文字列リソースを実際に返すコードです。
<img src="Flags/<%=CultureInfo.CurrentCulture%>.jpg">
<%=rm.GetString("greeting")%>
イメージ リソースは、ユーザーのカルチャ コードに基づいてファイル名を作成することにより動的に決定されます。文字列リソースについては、ResourceManager を使用して適切な .resources ファイルから文字列リソースを読み込みます。