我正在尝试使用Select语言功能开发MVC3(razor)应用程序。
将以下视图用作_Layout.cshtml
的部分视图
的 _SelectCulture
<text>
@Html.ActionLink("English", "SetCulture", new { controller = "Culture", culture = "en-GB" })
|
@Html.ActionLink("Welsh", "SetCulture", new { controller = "Culture", culture = "cy-GB" })
</text>
<div>
@System.Threading.Thread.CurrentThread.CurrentUICulture.ToString()
</div>
CultureController
public ActionResult SetCulture(string culture)
{
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(culture);
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
return RedirectToAction("Index", "Home");
}
但它仍然没有改变语言。
请帮助。
由于
答案 0 :(得分:8)
嗯,您正在更改当前线程的语言。当前线程以当前请求结束,稍后在执行控制器操作之后。然后,您将重定向到其他控制器操作。然后,ASP.NET生成一个新线程来提供这个请求,显然没有文化集。
所以你必须在某个地方坚持这种改变。基本上有3种不同的方法:
我按优先顺序排列。第一种方法是在所有路由中集成{culture}
令牌。恕我直言,这也是SEO方面的最佳方法。因此,如果您想以法语访问您的网站,您将重定向到/fr/home/index
。然后,您可以使用将在每个操作之前运行的自定义操作过滤器属性,检查文化路径参数并设置当前线程文化(此时间为当前操作)。
Cookie和会话还涉及在请求之间保持当前语言。在第一个示例中,这是在客户端上完成的,而在第二个示例中,它是在服务器中完成的。可以使用自定义操作过滤器在每个操作之前读取语言的值,并反映当前的线程文化。
您可以查看使用Session来保留当前语言的following guide。