【问题标题】:How to handle multiple language in MVC application?如何在 MVC 应用程序中处理多种语言?
【发布时间】:2016-04-09 22:40:02
【问题描述】:

我已经设置了我的应用程序,以便根据路由器识别的模式从不同的 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,但我就是不明白他们是怎么做到的。我看到一堆对数据库的调用,所以我怀疑它不是基于 RESX 文件(我的理解是这是正确的方法),尽管也有一些对 @TestResource 的引用。

现在我很困惑和不确定。有什么建议或澄清吗?

【问题讨论】:

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


    【解决方案1】:

    MVC 有一个有点不直观的特性使这变得非常容易。 MVC automatically reuses any route values 来自请求。因此,您的所有 URL 都会自动“继承”文化 - 无需在 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")
    

    通过上面的链接,如果当前的URL是/Home/Contact,那么生成的链接就是/Home/About。如果当前 URL 为/en/Home/Contact,则链接将生成为/en/Home/About

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

    【讨论】:

    • 嗯...我认识到您的回复的洞察力,所以(现在,已经交付了)我想知道您是否是说我通过实施特殊路线做得太多了和本地化属性。你是说我只需要在 _Layout.cshtml 中的某处放置三种语言的文化链接,一旦用户点击那里(因此选择文化),它就会继续存在? 不可能那么容易......可以吗?
    • 是的,没错。就这么容易。但是,它确实取决于是否存在与路由值匹配的路由(您已在问题中显示)。有关如何处理“默认”语言的信息,请参阅我的链接答案。
    • 太棒了。感觉就像一个错误(不过在这种情况下非常有帮助),但愚蠢的重新路由只处理第二个斜杠 之后的后缀。那太棒了!谢谢。
    • 但这是否适用于不同语言的多个并发会话?改变全球文化肯定会影响到他们所有人吗?
    • 上面的代码没有处理文化,它只是建立一个带有文化字符串的超链接。如果您一直到ASP.NET MVC 5 culture in route and url,则有一个CultureFilter,它根据URL 设置文化。这种文化不是全球性的,它与当前线程相关联,不会影响应用程序的其他用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多