2008-11-14 37 views
9

Khi xây dựng một trang web đa ngôn ngữ (với các mẫu web ASP.NET), tôi sẽ sử dụng một mô-đun HTTP để viết lại các URL để kết thúc với một cái gì đó thân thiện (đối với con người & tìm kiếm động cơ) như:Các trang web đa ngôn ngữ với ASP.NET MVC

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 

của tôi (newbie) hiểu biết về MVC là URL nên mất định dạng của

Controller/Action/Định danh

để tái tạo các chức năng trên với MVC sẽ kết thúc với URL tương tự như:

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

Câu hỏi ..

  • Tôi có thể chèn một mã quốc gia vào URL trước khi phân khúc 'điều khiển'?
  • Có thể lập bản đồ 'sản phẩm' và 'productos' cho cùng một bộ điều khiển không?

Nhờ sự giúp đỡ của bạn

Edit: Ngoài câu trả lời Panos' dưới đây tôi tìm thấy thêm thông tin về ASP.NET Website.

Trả lời

12

URL có thể chiếm hầu hết mọi biểu mẫu mà bạn thích. Để biết thêm thông tin, hãy kiểm tra ASP.NET MVC Framework (Part 2): URL Routing. Chỉ cần để bắt đầu (vì tôi không chắc chắn nếu nó là giải pháp tối ưu), bạn có thể thêm hai đường bay mới trong global.asax của bạn:

 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 = "" } 
     ); 

Những đường bay hiểu các URL sau (và bản đồ cả trong số họ đến ActionResult Category(string id, string subcategory) phương pháp ProductsController):

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

Nếu bạn muốn tạo URL như vậy trong quan điểm của bạn, bạn có thể sử dụng một cái gì đó như:

<%= 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" })%> 
+0

hoạt động? 'uk/Sản phẩm/Danh mục/1/A'' es/Productos/Category/1/A' Trong cả hai trường hợp này, nó sẽ được chuyển hướng đến Route 'ukRoute' đầu tiên vì lang là một trường chuỗi và khớp. – Saanch

+2

Tôi nghĩ rằng phương pháp được giới thiệu [trong blog này] (http://blog.maartenballiauw.be/post/2010/01/26/Translating-routes- (ASPNET-MVC-và-Webforms) .aspx) là một ý tưởng tốt hơn . – VahidNaderi

3

bạn có thể làm điều này, nhưng hãy nhớ rằng không phải tất cả các quốc gia đều là ngôn ngữ. Ví dụ, en-gb là đại diện thông thường cho tiếng Anh của Anh, hoặc cụ thể hơn, ví dụ, ngôn ngữ tiếng Anh của Anh cho nội dung tiếng Anh. Nếu bạn có thể, nó có giá trị theo các quy ước bắt nguồn từ RFC1766 cho ngôn ngữ LOCALE.

Công cụ tìm kiếm thực sự có xu hướng làm một công việc khá tốt trong việc đàm phán nội dung, vì vậy, bạn không nhất thiết phải có URI riêng biệt cho cùng một nội dung bằng các ngôn ngữ khác nhau. Ví dụ: Google Japan sẽ thu thập thông tin với ja-JP làm tiêu đề ngôn ngữ chấp nhận.

+0

Về công cụ tìm kiếm, bạn nên phát ra thuộc tính "lang" và "dir" trên phần tử "html". Tôi thích phương thức cookie mà tất cả có thể được xử lý trong Global.mã asax (hoặc thậm chí được bao bọc thành lớp cơ sở của cha mẹ HttpApplication để tự động hóa hoàn toàn cho bất kỳ trang web MVC hoặc ASPX nào) bằng cách lưu một cookie "văn hóa" tại AquireRequestState (với ngôn ngữ mặc định của trình duyệt hoặc trang web). phương thức ứng dụng "SetLanguage" chỉ thay đổi cookie và văn bản chuỗi. Sau đó, trang web hoạt động mà không có URL khác và nội dung hợp lệ (xác định ngôn ngữ của nó). –

Các vấn đề liên quan