2013-02-27 71 views
10

我對MVC中的文化變化有好奇心。我嘗試了兩種方式,但顯然我錯了某個地方。基於鏈接改變文化MVC4

在我的web.config我有:

<globalization uiCulture="auto" culture="auto" /> 

這是我試圖改變線程文化:

<li>@Html.ActionLink("Eng", "ChangeCulture", "Home", new { lang="en-US"}, new { @class = "languageSelectorEnglish" })</li> 

第一種方法

我有以下控制器:

public void ChangeCulture(string lang) 
    { 
     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang); 

     Response.Cookies.Remove("Language"); 
     var langCookie = new HttpCookie("Language"); 
     langCookie["Language"] = lang; 
     langCookie.Value = lang; 
     langCookie.Expires = System.DateTime.Now.AddDays(21); 
     Response.Cookies.Add(langCookie); 

     Response.Redirect(Request.UrlReferrer.ToString()); 
    } 

方法二

public ActionResult ChangeCulture(string lang) 
    { 
     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang); 

     // Split the url to url + query string 
     var fullUrl= Request.UrlReferrer.ToString(); 
     var questionMarkIndex = fullUrl.IndexOf('?'); 
     string queryString = null; 
     string url = fullUrl; 
     if (questionMarkIndex != -1) // There is a QueryString 
     { 
      url = fullUrl.Substring(0, questionMarkIndex); 
      queryString = fullUrl.Substring(questionMarkIndex + 1); 
     } 

     // Arranges 
     var request = new HttpRequest(null, url, queryString); 
     var response = new HttpResponse(new StringWriter()); 
     var httpContext = new HttpContext(request, response); 

     var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext)); 

     // Extract the data  
     var values = routeData.Values; 
     var controllerName = values["controller"]; 
     var actionName = values["action"]; 
     var areaName = values["area"]; 

     return RedirectToAction(actionName.ToString()); 
    } 

我在哪裏錯了?謝謝。

+0

你面臨的問題是什麼? – ssilas777 2013-02-27 09:33:32

+0

即使我改變了Thread當前的文化,文化也不想改變。我很快就會發布我的答案,因爲我找到了一種不設置cookie的方法。 – Kosmog 2013-02-27 10:17:07

回答

6

這似乎我需要覆蓋我的resource stringsculture而不是thread。所以我最後的方法是這樣的:

public void ChangeCulture(string lang) 
    { 
     Resources.Resources.Culture = new CultureInfo(lang); 

     Response.Redirect(Request.UrlReferrer.ToString()); 
    } 

希望這會有所幫助。

UPDATE:

當應用程序由多個用戶使用上面的代碼是不好的,因爲它設置相同的培養爲每一位用戶,無論他們使用的是什麼瀏覽器。

好辦法做到這一點是讓這​​臺在瀏覽器中cookie的方法:你需要讓每一個控制器從一個BaseController繼承

public void ChangeCulture(string lang) 
    { 
     Response.Cookies.Remove("Language"); 

     HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"]; 

     if (languageCookie == null) languageCookie = new HttpCookie("Language"); 

     languageCookie.Value = lang; 

     languageCookie.Expires = DateTime.Now.AddDays(10); 

     Response.SetCookie(languageCookie); 

     Response.Redirect(Request.UrlReferrer.ToString()); 
    } 

在此之後(棘手的方式)。這是棘手的,因爲你需要覆蓋Initialize

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 


     HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"]; 
     if (languageCookie != null) 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(languageCookie.Value); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCookie.Value); 
     } 
     else 
     { 
     //other code here 
     } 


     base.Initialize(requestContext); 
    } 
3

在你的web.config中刪除行:

<globalization uiCulture="auto" culture="auto" /> 

這些設置爲自動將默認的語言用戶的語言瀏覽器設置。這是重寫您的線程設置。

+0

你好。它沒有奏效,但我找到了一個辦法。我會盡快發佈我的答案。非常感謝你 。 – Kosmog 2013-02-27 10:15:20