サイト内のすべてのページに表示されるメニューから、ユーザーがサイトを表示する言語を選択できる典型的な言語メニューを実装しようとしています。
このメニューは、複数のマスター ページに表示されます (現在、ユーザーがログインしているページ用に 1 つと、ユーザーがログインしていないページ用に 1 つ)。
私の現在の実装には、マスター ページの基本クラスが 1 つあります (MasterBase と呼びましょう)。MasterBase にイベントがあります
public event LanguageChangedEventHandler LanguageChanged;
ここで、LanguagedChangedEventHandler は単純に次のように定義されます。
public delegate void LanguageChangedEventHandler(string NewCulture);
MasterBase にはオーバーライド可能なメソッドもあります
protected virtual void OnLanguageChanged(string NewCulture)
これは基本的にイベントを発生させます。
MasterBase を継承する各マスター ページは OnLanguageChanged をオーバーライドし、スレッドの CurrentUICulture を設定するなどの通常の処理を実行し、次に言語 Cookie を実行します。
Server.Transfer(this.Page.AppRelativeVirtualPath, true);
新しいカルチャのローカライズされた値でページをリロードするようにします。ログインしたユーザーのマスター ページでは、データベース内のユーザーの言語設定も更新されます。
現在、各言語オプションは、MasterBase から継承するマスター ページの LinkButton です。リンクがクリックされると、正しいカルチャ情報を渡す基本の OnLanguagedChanged メソッドが呼び出されます。例えば
protected void btnEnglish_Click(object sender, EventArgs e) {
this.OnLanguageChanged("en-US");
}
言語の変更を処理する必要がある各ページには、ページの読み込みに次のようなコードがあります...
((MasterBase)this.Master).LanguageChanged += this.Page_OnLanguageChanged;
// Where Page_OnLanguageChanged has the signature of LanguageChangedEventHandler
// and has stuff like reloading options in a drop down using the new language.
かなり複雑な「フレームワーク」=)
- まず、新しい開発者は、言語の変更を処理するために、MasterBase の LanguageChanged イベントにメソッドを接続する必要があることを理解するのが困難です。はい、文書化しています。しかし、それは単純明快なものではありません。
- 次に、言語の変更はすべてポストバックです。これは、ブラウザの [戻る] ボタンで戻りたい場合に特に問題になります。
よりエレガントなソリューションを探しています。上記の両方の問題がなく、現在の要件も処理するもの。
どんな提案でも大歓迎です。ありがとう。