0

我正在尝试开发具有选择语言功能的 MVC3(剃刀)应用程序。

使用以下视图作为_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>

文化控制器

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

但它仍然没有改变语言。

请提供任何帮助。

谢谢

4

1 回答 1

8

好吧,您正在更改当前线程的语言。当前线程以当前请求结束,该请求在您的控制器操作执行后稍晚一些。然后您将重定向到其他一些控制器操作。然后 ASP.NET 产生一个新线程来服务这个显然没有文化集的请求。

所以你必须在某个地方坚持这个改变。基本上有3种不同的方法:

  1. 路径变量
  2. 饼干
  3. 会议

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

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

您可以查看以下使用 Session 来保持当前语言的指南。

于 2012-05-09T14:36:13.697 回答