1

サイト内のすべてのページに表示されるメニューから、ユーザーがサイトを表示する言語を選択できる典型的な言語メニューを実装しようとしています。

このメニューは、複数のマスター ページに表示されます (現在、ユーザーがログインしているページ用に 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 から継承するマスター ページの LinkBut​​ton です。リンクがクリックされると、正しいカルチャ情報を渡す基本の 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.

かなり複雑な「フレームワーク」=)

  1. まず、新しい開発者は、言語の変更を処理するために、MasterBase の LanguageChanged イベントにメソッドを接続する必要があることを理解するのが困難です。はい、文書化しています。しかし、それは単純明快なものではありません。
  2. 次に、言語の変更はすべてポストバックです。これは、ブラウザの [戻る] ボタンで戻りたい場合に特に問題になります。

よりエレガントなソリューションを探しています。上記の両方の問題がなく、現在の要件も処理するもの。

どんな提案でも大歓迎です。ありがとう。

4

2 に答える 2

1

すべてのページが使用できるアプリケーション変数を設定するコントロールにこれを実装する方がよいように思えます。そうすれば、コードを 1 か所に実装するだけで、コントロールを表示する各ページで常に使用できるようになります (マスターにある可能性があるため、継承するすべてのページが自動的に取得します)。コントロールには、グローバル言語設定を設定してからページをリロードするハンドラーがあると思います。各ページは、page_load または prerender 中に言語設定をチェックし、それに応じて適切なローカライズされた文字列をロードします。

于 2008-11-09T01:59:02.010 に答える
1

PreInitベース ページのイベントを使用して、現在の UI カルチャを設定するだけです。言語がいつ変更されるかを各ページに知らせる必要がある理由がよくわかりません。

于 2008-11-09T02:00:12.243 に答える