2013-02-27 153 views
10

मेरे पास एमवीसी में संस्कृति परिवर्तन से संबंधित जिज्ञासा है। मैंने 2 तरीकों से कोशिश की, लेकिन स्पष्ट रूप से मैं कहीं गलत था।एक लिंक के आधार पर संस्कृति बदलें एमवीसी 4

मेरी 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

+0

संस्कृति बदलना नहीं चाहती है भले ही मैंने थ्रेड वर्तमान संस्कृति को बदल दिया हो। मैं जल्द ही अपना जवाब पोस्ट करूंगा क्योंकि मुझे कुकी सेट किए बिना ऐसा करने का कोई तरीका मिलता है। – Kosmog

उत्तर

6

ऐसा लगता है कि मुझे resource strings के लिए culture को ओवरराइड करने की आवश्यकता है और thread नहीं है। तो मेरी अंतिम विधि यह है:

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

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

उम्मीद है कि इससे मदद मिलती है।

अद्यतन:

कोड से ऊपर नहीं अच्छा है जब आपके आवेदन एकाधिक उपयोगकर्ताओं द्वारा प्रयोग किया जाता है, क्योंकि यह प्रत्येक उपयोगकर्ता के लिए एक ही संस्कृति सेट, कोई बात नहीं क्या ब्राउज़र वे उपयोग कर रहे है।

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

इस के बाद (मुश्किल रास्ता) आप एक BaseController से विरासत के लिए हर नियंत्रक बनाने की जरूरत है:

यह करने के लिए अच्छा तरीका है एक तरीका है जिसके अपने ब्राउज़र में एक cookie सेट बनाने के लिए है। यह मुश्किल है क्योंकि आपको 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