2010-08-26 19 views
1

在我目前的應用程序中,我想用全局資源實現ASP.Net本地化。我遇到這樣的問題,即在更改CurrentThread.CurrentUICulture和CurrentThread.CurrentCulture並更改爲另一個頁面後,這些值將被瀏覽器默認值覆蓋。如何防止Thread.CurrentThread.CurrentCulture在手動設置之後切換到默認瀏覽器值?

我有一個DropDownList,可以選擇不同的語言。在ItemChanged事件中,我存儲在會話中culturename,重定向到我defaultpage並使用此代碼

protected override void InitializeCulture() 
{ 
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE"); 
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE"); 
    base.InitializeCulture(); 
} 

切換到另一個contentpage,不替換InitializeCulture我回到默認瀏覽器語言後。我怎樣才能使這種持久?

我有什麼選擇?下面來我的腦海:

  • 在每一個* .aspx頁面中我做執行InitializeCulture
  • 我創建一個從System.Web.UI.Page派生並覆蓋InitializeCulture事件處理程序的新類。我使用的每個* .aspx頁面都來自它。

難道沒有更「內置」的方式嗎? ASP.net提供了很好的本地化支持,所以我想必須有一種更簡單/更有效的方式來實現我的目標。哪一個在那裏?

回答

2

您需要重新設置基本頁面的InitializeCulture方法中的文化,如上所述。這應該在每次請求時完成。 CurrentCulture值是根據瀏覽器發送的Accept-Languages頭設置的,並且對於每個新請求都將以這種方式進行設置。除了爲每個新請求手動設置之外,別無選擇,Page.InitializeCulture是一個很好的選擇。

+0

我決定創建一個從System.Web.UI.Page派生的新類並在其中重寫InitializeCulture。每個內容頁面都來自該類。 – citronas 2010-08-26 12:38:42

+0

無論如何總是使用基本頁面是一個好習慣。然後,您可以重寫像這樣的基本方法,而無需觸及每個類文件只是爲了更改它繼承的內容。 – Chris 2010-08-26 16:47:29

1

看看Asp.Net modules,或在global.asax中掛接events

使用所有頁面inhit的基類是另一個不錯的選擇,但在一個模塊的項目之間重用基類更困難。

+0

我假設你的意思是Global.asax中。我應該勾選哪個事件? Session_Start或Application_Start不會爲此做這項工作,因爲它們沒有被執行每一個請求 – citronas 2010-08-26 08:23:36

+0

@citronas,對不起,我已經做了很多時間,因爲我記得我在全局中使用了每個請求事件之一.asax(它可能是一個標準模塊上的事件) - 我無法訪問系統的源代碼,因爲它是針對老僱主的。 – 2010-08-26 08:33:15

+0

無論如何,我會給你提供一個HTTP模塊。 – citronas 2010-08-26 08:39:51

0

你可以把文化的web.config,在system.web部分:

<globalization culture="de-DE"/> 
+0

我想讓用戶能夠在應用程序運行時更改文化。在web.config中手動設置它只會幫助我設置所需的默認值,但不能解決問題 – citronas 2010-08-26 08:39:11

+0

@citronas:我明白了......當您使用內容頁時,母版頁中的Page_Init事件似乎是一個設置文化的好地方。 – Guffa 2010-08-26 10:02:26

+0

這不適合我。我一直在回英語。 – 2017-09-22 07:50:19

相關問題