Asp.net mvc ASP.NET MVC中支持多语言路由的建议

Asp.net mvc ASP.NET MVC中支持多语言路由的建议,asp.net-mvc,Asp.net Mvc,这里有一些关于MVC中多语言应用程序的问题,但大多数问题都是通过提供有关实现资源文件的详细信息,然后在视图或控制器中引用这些资源字符串来回答的。在检测用户的区域设置时,这对我来说很好 我现在想做的是支持本地化路由。例如,我们每个网站都有一些核心页面,比如联系我们页面 我想要实现的是: 1) 像这样的路线 /en/联系我们(英语路线) /sl/Kontakt(斯洛文尼亚路线) 2) 这两条路径都必须指向同一控制器和操作,并且不会本地化(它们将使用英语,因为它们是站点核心实现的一部分,因此对用户隐藏

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

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

我想要实现的是:

1) 像这样的路线

/en/联系我们(英语路线)

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

2) 这两条路径都必须指向同一控制器和操作,并且不会本地化(它们将使用英语,因为它们是站点核心实现的一部分,因此对用户隐藏):

我的想法是让控制器“反馈”和动作“反馈”

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

4) 我有一个SetCulture属性附加到BaseController,它是我所有控制器的父级,这个属性实际上继承了FilterAttribute并实现了IActionFilter——但是它做什么呢?嗯,它检测浏览器区域性,并在会话和cookie中设置该区域性(永久)-此功能也运行良好。它已经影响视图和视图用户控件,但此时不影响管线

5) 在页面顶部,我将给用户一个选择语言(sl | en)的机会。该决定必须优先于第4条)。如果用户到达我们的网站,并被检测为斯洛文尼亚人,他们决定切换到英语,这一决定必须成为永久性的。从现在起,SetCulture属性必须以某种方式释放其影响

6) 切换后,如果用户位于/sl/Kontakt,则应立即更新路由 应立即将其重定向至/en/与我们联系

这些是我想要的设计的约束条件。简单地说,我不希望在显示本地化内容时使用英语路线,反之亦然

欢迎提出建议

编辑:


这里有一些信息和指导,但我仍然希望听到更多关于这个问题的想法或实践。

为什么不创建所需的操作名称,并简单地重定向到单个实际实现的操作

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

    public ActionResult Contact() {
        return View();
    }

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

预览:

对于我的站点,URL模式应该是 大体上是这样的:

/{culture}/{site}

假设有一个叫做FAQ的页面, 它有不同的版本 语言。下面是一些示例URL 对于这些页面:

/en US/FAQ/de/FAQ/de CH/FAQ


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

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

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

不行,那样会把我的控制器类搞得一团糟。想想看,如果你决定支持德语或意大利语,我们的控制器类将变成什么?这也需要对控制器类进行维护,但我想将更改仅限于global.asax.cs和资源文件。您只需要转换操作和控制器吗?我认为如果您需要将映射到enum的路由值(类似于www.catalog.com/products/listbytoken/manufacturer中的manufacturer)转换为更适合我的情况,这将是一件痛苦的事情,因此我确认这一点。