2012-05-09 79 views
0

我想用Select语言功能开发MVC3(剃须刀)应用程序。MVC3(Razor) - 不以编程方式更改UI文化语言

_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"); 
     } 

,但它仍然不能改变语言。

任何帮助,请。

谢谢

回答

8

那么,你正在改变当前线程的语言。当前的线程以当前的请求结束,这个请求在你的控制器动作执行后稍晚一点。然后你重定向到其他控制器操作。然后ASP.NET产生一个新的线程来服务这个请求,显然没有文化设置。

所以你将不得不坚持这个改变的地方。基本上有3点不同的方法:

  1. 路线可变
  2. 饼干
  3. 会议

我把他们按优先顺序。第一种方法是在所有路线中集成一个{culture}令牌。恕我直言,这是SEO的最佳方法。因此,如果您想用法语获取您的网站,您将重定向到例如/fr/home/index。然后,您可以使用将在每个操作之前运行的自定义操作过滤器属性,检查文化路径参数并设置当前线程文化(这次是针对当前操作)。

Cookie和会话还涉及在请求之间保持当前语言。在第一个例子中,这是在客户端完成的,而第二个例子是在服务器端完成的。在每个操作之前,可以再次使用自定义操作筛选器来读取语言的值,并反映当前的线程文化。

你可以看看following guide,它使用Session来保存当前的语言。

+0

谢谢@Darin Dimitrov – Scorpion

+0

同一指南的作者也发表了关于路线方法的指南http://adamyan.blogspot.com/2010/07/addition-to-aspnet-mvc-localization.html –