如何在MVC应用程序中处理多种语言?

时间:2016-04-09 22:40:02

标签: c# asp.net-mvc razor asp.net-mvc-routing multilingual

我已经设置了我的应用程序,以便根据路由器识别的模式从不同的RESX文件中读取内容。每个页面都可以使用某种语言访问,具体取决于URL的第一部分。

routes.MapRoute(
  name: "Localization",
  url: "{lang}/{controller}/{action}/{id}", ...
);

当我在没有规范的情况下进行测试时,我会看到我的Lingo.REXS的英文版本,当我输入 se 时,我会使用瑞典语版本,即Lingo.se.RESX 。到目前为止,一切都很好。

但是,我不确定如何让用户控制语言的设置。我不希望它是自动的,也不是基于浏览器的设置,地理数据等假设的。我基本上想要三个标志(img控件)以某种方式神奇地设置该用户(或至少该浏览器) session)可以使用与单击的标志语言相对应的前缀进行路由。

所以,我们有/ se / Home / About和/ ge / Home / About。用户点击德国国旗 - 我们如何将它们路由到后者?如果他们点击瑞典国旗 - 我们如何将它们路由到前者?

我已经使用this blog进行了验证,但它没有解决如何根据点击的标记图片路由到某种语言的实际问题。我也发现了this blog,但我根本不明白他们是怎么做到的。我看到一堆对DB的调用所以我怀疑它不是基于RESX文件(我的理解是它是正确的方法),尽管还有一些对 @TestResource 的引用。 / p>

现在我很困惑也不确定。有任何建议或澄清吗?

1 个答案:

答案 0 :(得分:3)

MVC有一些非直观的功能,这使得这很容易。来自请求的MVC automatically reuses any route values。因此,您的所有网址都会自动“继承”文化 - 无需在ActionLink中明确指定。

唯一的例外是在语言选择期间。但是,您可以利用相同的路由行为在_Layout.cshtml中构建公共页眉或页脚。无论当前页面具有什么路由值都将被继承 - 您需要做的就是指定控制器,操作和文化。

@{ 
    var routeValues = this.ViewContext.RouteData.Values;
    var controller = routeValues["controller"] as string;
    var action = routeValues["action"] as string;
}
<ul>
    <li>@Html.ActionLink("Swedish", @action, @controller, new { lang = "se" }, new { rel = "alternate", hreflang = "se" })</li>
    <li>@Html.ActionLink("English", @action, @controller, new { lang = "en" }, new { rel = "alternate", hreflang = "en" })</li>
</ul>

如前所述,页面上的所有其他链接将自动从当前上下文传递文化,因此它们将自动保持在同一文化中。在这些情况下,没有理由明确传递文化。

@ActionLink("About", "About", "Home")

使用上述链接,如果当前网址为/Home/Contact,则生成的链接将为/Home/About。如果当前网址为/en/Home/Contact,则链接将生成为/en/Home/About

参考:ASP.NET MVC 5 culture in route and url