2011-06-02 85 views
4

我正在使用Visual Studio 2008和ASP.NET構建一個Web應用程序。我的大多數網頁都基於一個主頁面。這個母版頁包含三個按鈕鏈接,充當語言切換;在Click事件處理程序是這樣的:使用母版頁切換ASP.NET應用程序的語言

protected void lbuLangEN_Click(object sender, EventArgs e) 
{ 
    this.SwitchLanguage(string.Empty); 
} 

protected void lbuLangES_Click(object sender, EventArgs e) 
{ 
    this.SwitchLanguage("es"); 
} 

然後,我有我的私有方法SwitchLanguage

private void SwitchLanguage(string culture) 
{ 
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture); 
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture); 
} 

據我瞭解,這已經足夠了基於我的母版頁展示,使網頁一種本地化行爲,即根據文化從合適的本地文件獲取其資源。但是,它不起作用。它們總是以西班牙語顯示,這是我瀏覽器的默認語言。我在SwitchLanguage的入口點和出口點設置了一些跟蹤消息,顯然目前的線程並沒有改變它的文化信息:每調用一次SwitchLanguage,當前線程的文化就是「ES-ES」,無論我的代碼是什麼只是設置。

有沒有我的代碼或我採取的方法有問題?謝謝。

+0

的問題那就是你只是改變當前線程的語言,而每個請求都是它自己的線程。 – vcsjones 2011-06-02 16:48:04

+0

@vcsjones:我明白了。所以我需要存儲語言設置並以某種方式爲每個請求設置它,對嗎?有沒有什麼常用的技術? – CesarGon 2011-06-02 16:50:04

+0

你可以通過設置一個cookie做的伎倆,傳輸請求相同的路徑的請求是,建立一個HTTP模塊,並宣讀了該Cookie那裏設置的UICulture線程 – 2011-06-02 16:51:39

回答

10

你可以使用OnAcquireRequestStateGlobal.asax改變文化。它在會話加載後立即調用,但在任何主頁面事件之前調用。

所以在按鈕事件處理程序中,您將會話變量設置爲所需的當前文化。然後你重定向到當前頁面。然後Global.asax事件可以拿起新的語言,母版加載前右:

protected void OnAcquireRequestState(object sender, EventArgs e) 
{ 
    string cultureName = "en-GB"; 
    if (HttpContext.Current.Session != null && 
     HttpContext.Current.Session["CultureName"] is string) 
     cultureName = HttpContext.Current.Session["CultureName"]; 

    if (Thread.CurrentThread.CurrentUICulture.Name == cultureName) 
     return; 

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName); 
    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture; 
} 
+0

謝謝;這聽起來很不錯。我在哪裏連接OnAcquireRequestState事件處理程序? – CesarGon 2011-06-02 17:09:38

+0

@CesarGon:從字面上叫'Global.asax'的文件中。它應該已經在那裏了,否則,你可以從一個新創建的ASP.NET Web應用程序複製。 – Andomar 2011-06-02 17:23:45

+0

@Andomar:它不在那裏(我使用的是VS 2008),但我添加了它,並在Application_Start中添加了一行,如下所示:'this.AcquireRequestState + = Application_OnAcquireRequestState;'聽起來不錯? – CesarGon 2011-06-02 17:25:48

0

覆蓋在頁面級別的InitializeCulture方法來設置的UICulture

+0

我與母版頁工作; 'MasterPage'沒有'InitializeCulture'方法。 – CesarGon 2011-06-02 16:47:29

+1

這就是爲什麼我說,這樣做在頁面級別,沒關係只要給我一個-1,jezus :) :) – 2011-06-02 16:49:12

+1

好了,我不希望在每一個頁面重複相同的代碼。我確定有一種解決方案可以避免這種情況。 – CesarGon 2011-06-02 16:51:55

2

對於使用@Andomar解決方案的任何機構,該方法應該命名爲Application_AcquireRequestState位於Global.ascx代碼(如下面的Application_Start) ,並且不需要附加事件處理程序。 (如果你做的比這其他任何你可能會遇到的NullReferenceException即使在方法體中沒有代碼或你的方法根本無法運行!)
因此,代碼將是這樣的:

void Application_AcquireRequestState(object sender, EventArgs e) 
{ 
    string cultureName = "en-GB"; 
    if (HttpContext.Current.Session != null && 
     HttpContext.Current.Session["CultureName"] is string) 
     cultureName = HttpContext.Current.Session["CultureName"]; 

    if (Thread.CurrentThread.CurrentUICulture.Name == cultureName) 
     return; 

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName); 
    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture; 
}