基于一个链路MVC4改变培养 [英] Change culture based on a link MVC4
问题描述
我有相关的MVC文化变革的好奇心。我尝试了2种方式,但显然我错了地方。
I have a curiosity related to culture change in MVC. I tried in 2 ways, but apparently I was wrong somewhere.
在我的web.config我有:
In my Web.config I have :
<globalization uiCulture="auto" culture="auto" />
这是我如何试图更改线程的文化:
This is how I tried to change the thread culture :
<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());
}
我在哪里错了?谢谢你。
Where am I wrong ? Thank you.
推荐答案
这似乎是我需要重写文化
我的资源字符串
,而不是线程
。所以,我的最后一个方法是这样的:
It's seems I need to override the culture
for my resource strings
and not the thread
. So my final method is this :
public void ChangeCulture(string lang)
{
Resources.Resources.Culture = new CultureInfo(lang);
Response.Redirect(Request.UrlReferrer.ToString());
}
希望这有助于。
Hope this helps.
更新:
在code以上并不好当你的应用程序由多个用户使用,因为它设置相同的培养为每一位用户,不管什么浏览器,他们正在使用。
The code above is not good when your application is used by multiple users, because it sets same culture for every user, no matter what browser they are using.
好办法做到这一点是让这台在你的浏览器中的饼干
的方法:
The good way to do it is to make a method which sets a cookie
in your 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());
}
在此(棘手的方式),你需要让每一个控制器从一个BaseController继承。这是棘手,因为你需要重写初始化
。
After this ( the tricky way ) you need to make every controller to inherit from one BaseController. It is tricky because you need to override 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);
}
这篇关于基于一个链路MVC4改变培养的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!