【问题标题】:Suggestions for supporting multilingual routes in ASP.NET MVC在 ASP.NET MVC 中支持多语言路由的建议
【发布时间】:2011-03-20 21:00:59
【问题描述】:

在 SO 上存在关于 MVC 中的多语言应用程序的问题,但主要通过提供有关实现资源文件的详细信息,然后在视图或控制器中引用这些资源字符串来回答这些问题。结合用户区域设置的检测,这对我来说很好。

我现在要做的是支持本地化路由。例如,我们为每个网站都有一些核心页面,例如“联系我们”页面。

我想要实现的是:

1) 像这样的路线

/zh/Contact-us(英文路线)

/sl/Kontakt(斯洛文尼亚路线)

2) 这两个路由都必须转到相同的控制器和操作,并且它们不会被本地化(它们将是英文的,因为它们是网站核心实现的一部分,因此对用户隐藏起来):

我的想法是让Controller“Feedback”和Action“FeedbackForm”

3) FeedbackForm 将是一个 View 或 View User 控件(它会使用对 RESX 文件中的字符串的引用,正如我之前所说,我已经设置了它并且它可以工作)

4) 我有一个附加到 BaseController 的 SetCulture 属性,它是我所有控制器的父级,这个属性实际上继承了 FilterAttribute 并实现了 IActionFilter - 但它有什么作用?好吧,它会检测浏览器文化并将该文化设置在 Session 和 cookie 中(永远)——这个功能也可以正常工作。它已经影响了 Views 和 View User Controls 但目前它不影响路由。

5) 在页面顶部,我将给用户一个机会来选择他的语言 (sl|en)。该决定必须推翻 4)。如果用户到达我们的网站并被检测为斯洛文尼亚语并且他们决定切换到英语,则该决定必须成为永久性的。从此时起,SetCulture 属性必须以某种方式失去其作用。

6) 切换后,路由应立即更新 - 如果用户位于 /sl/Kontakt 他应该立即被重定向到/en/Contact-us。

这些是我想要的设计限制。简而言之,我不想在显示本地化内容的同时使用英文路线,反之亦然。

欢迎提出建议。

编辑:

这里有一些信息和指导 - Multi-lingual websites with ASP.NET MVC,但我仍然希望听到更多关于这个问题的想法或实践。

【问题讨论】:

  • 你只需要翻译动作和控制器吗?我认为如果您需要翻译映射到枚举的路由值(类似于 www.catalogue.com/products/listbytoken/manufacturer 中的制造商),那将是痛苦的

标签: asp.net-mvc


【解决方案1】:

Translating routes (ASP.NET MVC and Webforms)

这个怎么样? 创建自定义翻译路由类。

【讨论】:

    【解决方案2】:

    Localization with ASP.NET MVC using Routing

    预览:

    对于我的网站,URL 架构应如下所示 一般是这样的:

    /{文化}/{站点}

    想象有一个页面叫FAQ, 有不同的 语言。以下是一些示例 URL 对于这些页面:

    /zh-CN/FAQ /de-DE/FAQ /de-CH/FAQ

    【讨论】:

    • 这更适合我的情况,所以我确认一下。
    【解决方案3】:

    为什么不创建所需的动作名称并简单地为单个实际实现创建 RedirectToAction?

        public ActionResult Kontakt() {
            return RedirectToAction("Contact");
        }
    
        public ActionResult Contact() {
            return View();
        }
    

    【讨论】:

    • 不可能,这会让我的控制器类变得一团糟。想想看,如果你决定支持德语或意大利语,我们的控制器类会变成什么?这也需要维护控制器类,但我想将更改仅限于 global.asax.cs 和资源文件。
    【解决方案4】:

    我刚刚使用了一个简单的“全球化资源”解决方案,如下所示:

    routes.MapRoute(
              "nameroute", // Route name
              App_GlobalResources.Geral.Route_nameroute+"/{Obj}", // URL with parameters
              new { controller = "Index", action = "Details", Obj = UrlParameter.Optional } // Parameter defaults
          );
    

    但是,您可以根据需要进行自定义。

    【讨论】:

      猜你喜欢
      • 2013-12-11
      • 2011-08-17
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      相关资源
      最近更新 更多