ASP.NET 2.0 は、多言語変換機能と複数スタイル テーマ変換機能を提供します。2 つの実装形式は比較的似ているため、まとめて説明します。
1. 言語スイッチャー 多言語切り替え クイックスタートチュートリアルでは、ユーザーが選択した言語を保存して適用する方法を紹介します。通常、DropDownList はユーザーが選択できるようにサポートされている言語を表示するために使用され、通常はマスターページに配置され、ユーザーが選択した言語がここで使用されます。 Cookie セッションまたはクエリ文字列に保存することもできます。ユーザーが以前に選択した言語を使用するには、ページの InitializeCulture メソッドをオーバーライドします。言語を設定する操作 (ここでは SelectedIndexChanged イベント) は InitializeCulture 時間の後に発生するため、設定操作が完了した直後に現在のページを有効にするには、このページをリロードして InitializeCulture イベントをトリガーするリダイレクトが必要です。以下はクイックスタートのコードの一部です。赤い部分に注目してください。一部のページ アドレスの背後にクエリ文字列が存在する可能性があるため、個人的には赤いコード部分を Response.Redirect(Request.Url.PathAndQuery); に置き換えるのが最適だと考えています。
protected void DropDownLanguage_SelectedIndexChanged(オブジェクト送信者、EventArgs e)
{
文字列 SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//選択したユーザー言語をプロファイルに保存します
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage)
//ページの再初期化を強制的に実行して InitializeCulture()
Response.Redirect(Request.Url.LocalPath);
}
保護されたオーバーライド void InitializeCulture()
{
// 仮想メソッド InitializeCulture() をオーバーライドして、プロファイルにユーザー言語設定が含まれているかどうかを確認します
string UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
if (ユーザーカルチャー != "")
{
// プロファイルにユーザー言語設定があるので、それに切り替えます
Thread.CurrentThread.CurrentUICulture = 新しい CultureInfo(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
コードの重複を減らすために、通常、顧客の基本ページ クラスはカスタマイズされ、Page クラスを継承させてから、カスタマイズされたページの基本クラスの InitializeCulture メソッドを再初期化します。最後に、カスタム ページの基本クラスから各ページを継承します。こうすることで、すべてのページで InitializeCulture メソッドをオーバーライドする必要がなくなります。
ただし、ページを追加するたびにカスタム ページの基本クラスを継承するように郵便番号を変更する必要があるため、上記の方法はまだ満足のいくものではありません。
InitializeCulture メソッドでは、現在のスレッドの Culture と UICulture のみが実際に変更されることに気付きました。では、これら 2 つの属性は、アプリケーションのイベントなどのグローバル イベントで変更できますか?私はずっと前にこれを試し、次のコードのように、Application の BeginRequest イベントがトリガーされたときに InitializeCulture の詳細を実装しました。
void Application_BeginRequest(オブジェクト送信者、EventArgs e)
{
string lang = string.Empty;//インバリアント カルチャのデフォルト
lang = プロファイル.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = 文字列.空;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
beginrequest トリガー フェーズ中にプロファイル オブジェクトが asp.net によってまだ作成されていないため、赤色の部分は他のメソッドに置き換える必要があることに注意してください。 Cookieに置き換えることができます。
この時はグローバルイベントで扱うので後から上書きされるかもしれないと思って実行したらうまくいかなかった記憶があります。そのため、当時は InitializeCulture メソッドがまだ使用されていました。今日、asp.net フォーラムで誰かがこれをやっているのを見ました。
void Application_BeginRequest(オブジェクト送信者, EventArgs e){
string lang = string.Empty;//インバリアント カルチャのデフォルト
HttpCookie cookie = Request.Cookies["DropDownName"];
if (cookie != null && cookie.Value != null)
lang = Request.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
そのときは何かが正しく設定されていないのではないかと思い、もう一度試してみると、それがページヘッダーコマンド <%@ Page UICulture="auto" Culture="auto" %> であることが判明しました。カルチャはページ内で設定され、グローバル設定をオーバーライドします。それを削除すると、グローバル設定が有効になりました。ページ内のカルチャ設定はグローバル設定をオーバーライドし、ページ内の InitializeCulture メソッドの設定 (正確には、このメソッドをサポートするすべてのコントロール) がページ設定をオーバーライドするようです。実際、Page クラスの InitializeCulture メソッドのデフォルト実装は空であるため、ページ ヘッダー命令 UICulture="auto" Culture="auto" を削除すると、Global の設定が有効になります。
さらに、(私のように) ユーザーの選択を保存するために本当に Profile を使用したい場合は、beginrequest ステージでは処理できません。PreRequestHandlerExecute イベントがトリガーされたときに処理します。
void Application_PreRequestHandlerExecute(オブジェクト送信者、EventArgs e)
{
string lang = string.Empty;//インバリアント カルチャのデフォルト
lang = プロファイル.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = 文字列.空;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
この時点でプロファイルが作成されているので利用できるようになります。
2. マルチスタイルテーマ切り替えテーマスイッチャー
この記事ではテーマの切り替えについて説明していますが、形式は言語の切り替えに非常に似ていると思います。彼は HttpModule を Global.asax ファイル内の対応するイベント処理と配布の直下に配置できると思います。保存には Cookie を使用します。プロファイルが提供されているので、それを使用する方がパフォーマンスには問題ないと思います。
出典:厚い蓄積と繁栄BLOG