我的ASP.NET MVC5应用程序出现问题。我的应用程序可以设置在浏览器中设置的lang / culture(现在只有英语和波兰语(默认))。我想通过点击Html.ActionLink让用户改变语言/文化。
我创建了一个类:
namespace Guestbook
{
public static class Click
{
public static void SetCulture(string name)
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
}
}
我的观点中有:
@Html.ActionLink("PL", "", "Guests", routeValues: null, htmlAttributes: new { onclick = "SetCulture(\"pl\");" })
@Html.ActionLink("EN", "", "Guests", routeValues: null, htmlAttributes: new { onclick = "SetCulture(\"en\");" })
当然,它不起作用。我还需要什么? JavaScript函数?
答案 0 :(得分:8)
最简单的答案是您需要创建一个然后链接到的控制器。
public class LanguageController : Controller
{
public ActionResult SetLanguage(string name)
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
HttpContext.Current.Session["culture"] = name;
return RedirectToAction("Index", "Home");
}
}
然后在你看来:
<a href="@Url.Action("SetLanguage", "Language", new { @name = "pl" })">Polski</a>
<a href="@Url.Action("SetLanguage", "Language", new { @name = "en" })">English</a>
您可以考虑将会话或类似用户数据存储。
编辑:
例如,您可以在global.asax中使用Application_BeginRequest事件。
protected void Application_BeginRequest(Object sender, EventArgs e)
{
var name = HttpContext.Current.Session["culture"] as string;
if (string.IsNullOrEmpty(name))
{
return;
}
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture;
}
编辑:
将Cookie保存在SetLanguage操作中:
var cookie = new HttpCookie("_culture", name);
cookie.Expires = DateTime.Today.AddYears(1);
Response.SetCookie(cookie);
在Application_BeginRequest中获取cookie:
var cookie = HttpContext.Current.Request.Cookies["_culture"];
var name = cookie != null ? cookie.Value : null;
答案 1 :(得分:1)
我创建了一个小型控制器并编辑了我的视图。 @Olivier(感谢队友!)向我展示了如何做到这一点,但它没有用,因为我的应用程序将文化存储在cookie中,而不是存储在会话中。
控制器:
public class LanguageController : BaseController
{
// GET: Language
public ActionResult SetLanguage(string name)
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
HttpCookie cultureCookie = new HttpCookie("_culture");
cultureCookie.Value = name;
cultureCookie.Expires = DateTime.UtcNow.AddYears(1);
Response.Cookies.Remove("_culture");
Response.SetCookie(cultureCookie);
return RedirectToAction("Index", "Guests");
}
}
LanguageController继承自BaseController(继承自Controller),因为我使用了本教程:ASP.NET MVC 5 Internationalization by Nadeem Afana
在我的观点中:
<a href="@Url.Action("SetLanguage", "Language", new { @name = "pl" })">Polski</a>
<a href="@Url.Action("SetLanguage", "Language", new { @name = "en" })">English</a>