使用 ASP.NET MVC 的多语言网站

Posted

技术标签:

【中文标题】使用 ASP.NET MVC 的多语言网站【英文标题】:Multi-lingual websites with ASP.NET MVC 【发布时间】:2010-09-22 10:16:13 【问题描述】:

在构建多语言网站(使用 ASP.NET 网络表单)时,我将使用 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

问题..

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

感谢您的帮助

编辑: 除了下面 Panos 的回答之外,我还发现了有关 ASP.NET Website 的更多信息。

【问题讨论】:

【参考方案1】:

网址几乎可以采用您喜欢的任何其他形式。欲了解更多信息,请查看ASP.NET MVC Framework (Part 2): URL Routing。只是为了开始(因为我不确定它是否是最佳解决方案),您可以在 global.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 在这两种情况下,它将被定向到第一个路由 ukRoute,因为 lang 是一个字符串字段并且匹配。 我觉得in this blog介绍的方法比较好。【参考方案2】:

您可以这样做,但请记住,并非所有国家/地区都是语言。例如,en-gb 是英国英语的常用表示,或者更具体地说,是英国内容的英国语言环境。如果可以的话,值得遵循 RFC1766 派生的语言-LOCALE 约定。

顺便说一句,搜索引擎实际上倾向于在处理内容协商方面做得相当好,因此您不必为不同语言的相同内容使用单独的 URI。例如,Google Japan 将使用 ja-JP 作为接受语言标头进行抓取。

【讨论】:

关于搜索引擎,您应该在“html”元素上发出“lang”和“dir”属性。我更喜欢通过在 AquireRequestState 保存“文化”cookie(使用浏览器或网站默认语言),这很容易通过“SetLanguage”应用程序方法更改为任何首选项,该方法仅更改 cookie 和线程文化。然后网站在没有不同 URL 的情况下工作,并且内容有效(识别其语言)。

以上是关于使用 ASP.NET MVC 的多语言网站的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 多语言实现——URL路由

使用 OWIN 和异步方法的多语言网站

Asp.Net MVC 多语言(html+js共用一套资源文件)

asp.net MVC 多语言设计

asp.net MVC 多语言设计

asp.net MVC 多语言设计