2012-05-09 75 views
0

我想用Select語言功能開發MVC3(剃鬚刀)應用程序。MVC3(Razor) - 不以編程方式更改UI文化語言

_Layout.cshtml _SelectCulture使用下面的觀點作爲一個局部視圖

<text> 
    @Html.ActionLink("English", "SetCulture", new { controller = "Culture", culture = "en-GB" }) 
    | 
    @Html.ActionLink("Welsh", "SetCulture", new { controller = "Culture", culture = "cy-GB" }) 
</text> 
<div> 
    @System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() 
</div> 

CultureController

public ActionResult SetCulture(string culture) 
     { 
     System.Globalization.CultureInfo ci = new  System.Globalization.CultureInfo(culture); 

      System.Threading.Thread.CurrentThread.CurrentCulture = ci; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = ci; 

      return RedirectToAction("Index", "Home"); 
     } 

,但它仍然不能改變語言。

任何幫助,請。

謝謝

回答

8

那麼,你正在改變當前線程的語言。當前的線程以當前的請求結束,這個請求在你的控制器動作執行後稍晚一點。然後你重定向到其他控制器操作。然後ASP.NET產生一個新的線程來服務這個請求,顯然沒有文化設置。

所以你將不得不堅持這個改變的地方。基本上有3點不同的方法:

  1. 路線可變
  2. 餅乾
  3. 會議

我把他們按優先順序。第一種方法是在所有路線中集成一個{culture}令牌。恕我直言,這是SEO的最佳方法。因此,如果您想用法語獲取您的網站,您將重定向到例如/fr/home/index。然後,您可以使用將在每個操作之前運行的自定義操作過濾器屬性,檢查文化路徑參數並設置當前線程文化(這次是針對當前操作)。

Cookie和會話還涉及在請求之間保持當前語言。在第一個例子中,這是在客戶端完成的,而第二個例子是在服務器端完成的。在每個操作之前,可以再次使用自定義操作篩選器來讀取語言的值,並反映當前的線程文化。

你可以看看following guide,它使用Session來保存當前的語言。

+0

謝謝@Darin Dimitrov – Scorpion

+0

同一指南的作者也發表了關於路線方法的指南http://adamyan.blogspot.com/2010/07/addition-to-aspnet-mvc-localization.html –