2008-11-09 73 views
1

我試圖實現一個典型的語言菜單,用戶可以通過網站中所有頁面顯示的菜單選擇他們想要查看網站的語言。在ASP.NET應用程序中實現語言菜單的最佳方式

該菜單將出現在多個母版頁上(當前用於用戶登錄的頁面和用戶不在其中的頁面)。

我目前的實現是有一個主頁面基類(我們稱之爲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); 

得到的頁面與新的文化本地化的值重新加載。在登錄用戶的母版頁上,它還更新用戶在db中的語言pref。

每種語言選項當前都是從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事件來處理語言更改。是的,我們會記錄它。但是這仍然不是直截了當,顯而易見的。其次,所有語言修改都是回傳的。這是有問題的,特別是當您想要使用瀏覽器「後退」按鈕導航時。

我正在尋找更優雅的解決方案。一個既沒有上述問題,也處理我目前的要求。

非常感謝您的任何建議。謝謝。

回答

1

在我看來,最好在控件中實現這一點,該控件設置所有頁面可以使用的應用程序變量。這樣你就可以在一個地方實現代碼,並在顯示控件的每個頁面上始終可用(可能在你的主頁中,所有繼承的頁面會自動獲取)。我想在控制中你會有一個處理程序來設置全局語言設置,然後重新加載頁面。每個頁面將在page_load或prerender期間檢查語言設置,並相應地加載適當的本地化字符串。

+0

有幫助但仍不能解決不需要回發的問題。 – Fung 2008-11-09 14:35:58

1

我只是使用基頁上的PreInit事件來設置當前的用戶界面文化。我不清楚爲什麼每個頁面都需要知道語言何時更改。

相關問題