MVC3(Razor) - 不以编程方式更改UI文化语言

时间:2012-05-09 14:33:41

标签: asp.net-mvc asp.net-mvc-3 razor

我正在尝试使用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");
        }

但它仍然没有改变语言。

请帮助。

由于

1 个答案:

答案 0 :(得分:8)

嗯,您正在更改当前线程的语言。当前线程以当前请求结束,稍后在执行控制器操作之后。然后,您将重定向到其他控制器操作。然后,ASP.NET生成一个新线程来提供这个请求,显然没有文化集。

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

  1. 路线变量
  2. 饼干
  3. 会话
  4. 我按优先顺序排列。第一种方法是在所有路由中集成{culture}令牌。恕我直言,这也是SEO方面的最佳方法。因此,如果您想以法语访问您的网站,您将重定向到/fr/home/index。然后,您可以使用将在每个操作之前运行的自定义操作过滤器属性,检查文化路径参数并设置当前线程文化(此时间为当前操作)。

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

    您可以查看使用Session来保留当前语言的following guide