2013-02-27 8 views
10

Ho una curiosità legata al cambio di cultura in MVC. Ho provato in 2 modi, ma a quanto pare ho sbagliato da qualche parte.Cambia cultura in base a un collegamento MVC4

Nella mia Web.config ho:

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

Così ho provato a cambiare la cultura filo:

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

Primo metodo

Ho il seguente controllore :

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()); 
    } 

Secondo metodo

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()); 
    } 

Dove sbaglio? Grazie.

+0

Qual è il problema che si sta affrontando? – ssilas777

+0

La cultura non ha voluto cambiare anche se ho cambiato la cultura corrente del thread. Pubblicherò presto la mia risposta perché trovo un modo per farlo senza impostare un cookie. – Kosmog

risposta

6

Sembra che sia necessario sostituire lo culture per il resource strings e non lo thread. Quindi il mio metodo finale è questo:

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

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

Spero che questo aiuti.

UPDATE:

Il codice di cui sopra non è buono quando l'applicazione viene utilizzato da più utenti, perché stabilisce stessa cultura per ogni utente, non importa quale sia il browser che stanno utilizzando.

Il buon modo per farlo è quello di rendere un metodo che imposta un cookie nel browser:

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()); 
    } 

Dopo questo (il modo ingannevole) è necessario fare ogni controller di ereditare da una BaseController. È complicato perché è necessario eseguire l'override di 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

Rimuovere la riga nel web.config:

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

Impostazione questi per auto sarà di default la lingua alla lingua dell'utente impostare sul browser. Questo sta ignorando le impostazioni del tuo Thread.

+0

Ciao. Non ha funzionato, ma ho trovato un modo per farlo. Pubblicherò la mia risposta il prima possibile. Grazie mille . – Kosmog