我对MVC中的文化变迁有好奇心.我尝试了两种方式,但显然我在某个地方错了.
在我的Web.config我有:@H_301_3@
- <globalization uiCulture="auto" culture="auto" />
这是我如何改变线程文化:@H_301_3@
- <li>@Html.ActionLink("Eng","ChangeCulture","Home",new { lang="en-US"},new { @class = "languageSelectorEnglish" })</li>
我有以下控制器:@H_301_3@
- 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());
- }
我在哪里错了?谢谢.@H_301_3@
解决方法
看来我需要覆盖我的资源字符串而不是线程的文化.所以我的最终方法是这样的:
- public void ChangeCulture(string lang)
- {
- Resources.Resources.Culture = new CultureInfo(lang);
- Response.Redirect(Request.UrlReferrer.ToString());
- }
希望这可以帮助.@H_301_3@
更新:@H_301_3@
当您的应用程序被多个用户使用时,上面的代码不是很好,因为它为每个用户设置相同的文化,无论他们使用什么浏览器.@H_301_3@
这样做的好方法是在浏览器中设置一个cookie:@H_301_3@
- 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继承.这是棘手的,因为你需要重写Initialize.@H_301_3@
- 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);
- }