使用ASP.NET MVC实现多语言网站

10

在构建多语言网站(使用ASP.NET Web Forms)时,我会使用HTTP模块将URL重写为友好的形式(对于人类和搜索引擎),例如:

uk/products/product_category_one/sub_category_one/index.aspx
uk/products/product_category_one/sub_category_one/widget_mk5.aspx
es/productos/categoría_de_producto_una/widget_mk5.aspx

我的(新手)理解是MVC中URL的格式应该为

控制器 / 动作 / 标识符

因此,使用MVC复制上面的功能将会得到类似以下的URL:

products/category/123/product_category_one/sub_category_one
products/items/456/widget_mk5

问题..

  • 我可以在“controller”段之前插入国家代码到URL中吗?
  • 是否可能将“products”和“productos”映射到同一个控制器?

感谢您的帮助

编辑:除了Panos在下面的答案外,我在ASP.NET网站上找到了更多信息。

2个回答

12

URL可以采用几乎任何其他形式。欲了解更多信息,请查看ASP.NET MVC框架(第2部分):URL路由。只需开始(因为我不确定是否是最优解决方案),您可以在全局.asax中添加两个新路由:

        routes.MapRoute(
            "ukRoute",
            "{lang}/Products/{action}/{id}/{subcategory}",
            new { lang = "uk", controller = "Products", action = "Index", id = "", subcategory = "" }
        );
        routes.MapRoute(
            "esRoute",
            "{lang}/Productos/{action}/{id}/{subcategory}",
            new { lang = "es", controller = "Products", action = "Index", id = "", subcategory = "" }
        );

这些路由理解以下URL(并将它们都映射到ProductsControllerActionResult Category(string id, string subcategory)方法):

uk/Products/Category/1/A
es/Productos/Category/1/A

如果你想在你的视图中创建这样的URL,你可以使用类似以下内容的代码:

<%= Html.RouteLink("English 1.A", "ukRoute", new { lang = "uk", action = "Category", id = "1", subcategory = "A" })%>
<%= Html.RouteLink("Spanish 1.A", "esRoute", new { lang = "es", action = "Category", id = "1", subcategory = "A" })%>

它是否有效? uk/Products/Category/1/A es/Productos/Category/1/A 在这两种情况下,由于lang是一个字符串字段并匹配,因此它将被定向到第一个路由“ukRoute”。 - Saanch
2
我认为这篇博客介绍的方法是一个更好的想法。 - VahidNaderi

3
你可以这样做,但请记住,并非所有国家都有自己的语言。例如,en-gb 是英国英语的常见表示方式,或更具体地说,是用于英语内容的大不列颠区域。如果可以的话,最好遵循基于 RFC1766 的语言-区域约定。
顺便说一下,搜索引擎通常能够很好地处理内容协商,因此您不一定需要为不同语言的相同内容拥有单独的 URI。例如,Google 日本将使用 ja-JP 作为接受语言标头进行爬取。

关于搜索引擎,您应该在“html”元素上发出“lang”和“dir”属性。我更喜欢使用cookie方法,可以在Global.asax代码中处理所有内容(甚至可以包装到父级HttpApplication基类中,以便为任何MVC或ASPX网站完全自动化),通过在AquireRequestState(使用浏览器或网站默认语言)保存“culture” cookie来轻松更改为任何偏好,然后通过“SetLanguage”应用程序方法更改cookie和线程文化。然后,网站可以在没有不同URL的情况下工作,并且内容有效(识别其语言)。 - Tony Wall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接