2013-04-25 77 views
3

全球化:之所以問這個問題是有一個更好的瞭解如何Thread.CurrentThread.CurrentUICulture工作有關性能和錯誤消息的ViewModels和控制器Thread.CurrentThread.CurrentUICulture Vs的接受語言中的ViewModels

我的已設置我的項目並覆蓋OnActionExecuting我的控制器的方法我已經根據cookie中存儲的用戶選擇設置了語言。

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 

    HttpCookie cookie = Request.Cookies["lang"]; 

    string lang = cookie != null ? cookie.Value : "en-US"; 
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); 
} 

現在,在此之後,檢查HTTP請求中的Accept-Language頭由瀏覽器發送,用戶的變化並沒有反映 - 值仍然是「EN-US」。這讓我覺得這兩個不是依賴的。

我也已將代碼移到Global.asax,但效果相同。從昨天開始。

Thread.CurrentThread.CurrentUICulture設置影響頁面上的文本,但不影響來自ViewModel註釋的錯誤消息或屬性。但是當從瀏覽器更改Accept-Language時,則會從正確的資源文件中選取錯誤消息。

  • 是否可以操作Accept-Language標題? - 這似乎是隻讀的
  • 主要問題Thread.CurrentThread.CurrentUICulture如何工作?這似乎是互聯網上使用的大多數例子/文章/博客等。

回答

3

爲了得到一個公共網站與ASP.NET MVC全球化的權利,我提出以下建議:

  • 使用(片段)的URL來確定文化,而不是曲奇餅。否則,將無法使用預先定義的語言鏈接到頁面,搜索引擎將無法索引您的內容。
  • 瀏覽器首可以用來重定向在首次訪問相應的語言(例如,調用網頁時沒有任何 URL片段:www.mysite.com重定向到www.mysite.com/en-US /用於在瀏覽器中具有en-US偏好的用戶)
  • OnActionExecuting太晚用於文化初始化。我建議閱讀Alex Adamyan's article關於ASP.NET MVC中的本地化,並實施定製路由處理程序以初始化UiCulture/Culture。這也可以與ModelBinding正確工作(例如,在視圖模型類上使用資源和屬性時)。

至於其他問題:自從客戶端將它們發送到服務器後,修改Accept-Language標題沒有任何意義。即使你可以修改它們,客戶也永遠不會知道它。

+0

感謝您提供基於網址的建議。我知道這一點,但現在不是要求。檢查你提供的鏈接,我將邏輯移至'Application_AcquireRequestState',似乎現在正在工作。另外,感謝「太遲了」的評論,這很有道理。 – codingbiz 2013-04-25 16:10:14

+0

關於我的最後一個問題,在這樣的應用程序中可能存在多少個線程。 '線程。CurrentThread'指的是當前的,這意味着可能有很多。什麼時候創建,爲什麼?謝謝。 – codingbiz 2013-04-25 16:11:41

+0

'Application_AcquireRequestState'在某些情況下也不起作用(對於modelbinding時出現本地化錯誤消息的時間太晚),這就是爲什麼我推薦Alex使用自定義RequestHandler的方法。它也比global.asax中的魔術事件更感_MVC_。 – marapet 2013-04-25 19:29:55