我对MVC中的文化变化有好奇心。我试过两种方式,但显然我错了。
在我的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 :(得分:7)
似乎我需要覆盖culture
的{{1}},而不是resource strings
。所以我的最终方法是:
thread
希望这会有所帮助。
更新:
当您的应用程序被多个用户使用时,上面的代码并不好,因为它为每个用户设置了相同的文化,无论他们使用什么浏览器。
这样做的好方法是制作一个在浏览器中设置 public void ChangeCulture(string lang)
{
Resources.Resources.Culture = new CultureInfo(lang);
Response.Redirect(Request.UrlReferrer.ToString());
}
的方法:
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
答案 1 :(得分:4)
删除web.config中的行:
<globalization uiCulture="auto" culture="auto" />
将这些设置为自动会将语言默认为用户在浏览器上设置的语言。这会覆盖您的线程设置。