2008-11-14 13 views
9

Al compilar un sitio web multilingüe (con formularios web ASP.NET), usaré un módulo HTTP para reescribir las direcciones URL y terminar con algo amigable (para humanos & búsqueda motores) como:Sitios web multilingües con 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 

Mi novato) comprensión (de MVC es que la URL debe tener el formato de

controlador/Acción/Identificador

así replicar la funcionalidad por encima de la MVC va a terminar con las direcciones URL similar a:

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

Preguntas ..

  • puedo insertar un código de país en la URL antes de que el segmento de 'controlador'?
  • ¿Es posible asignar "productos" y "productos" al mismo controlador?

Gracias por su ayuda

Editar: Además de la respuesta de Panos continuación he encontrado más información sobre el ASP.NET Website.

Respuesta

12

La URL puede tomar casi cualquier otra forma que desee. Para obtener más información, consulte ASP.NET MVC Framework (Part 2): URL Routing. Sólo para arrancar (ya que no estoy seguro de si es la solución óptima), puede agregar dos nuevas rutas en su 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 = "" } 
     ); 

Estas rutas comprenden las siguientes URL (y el mapa de los dos para la ActionResult Category(string id, string subcategory) método de ProductsController):

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

Si desea crear este tipo de URL en sus puntos de vista se puede usar algo como:

<%= 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

¿funciona? 'uk/Products/Category/1/A''es/Productos/Category/1/A' En ambos escenarios, se dirigirá a la primera Route' ukRoute' ya que lang es un campo de cadena y coincide. – Saanch

+2

Creo que el método introducido [en este blog] (http://blog.maartenballiauw.be/post/2010/01/26/Translating-routes- (ASPNET-MVC-and-Webforms) .aspx) es una mejor idea . – VahidNaderi

3

usted puede hacer esto, pero tenga en cuenta que no todos los países son idiomas. Por ejemplo, en-gb es la representación habitual para el inglés británico, o más específicamente, la configuración regional de Gran Bretaña para contenido en inglés, por ejemplo. Si puede, vale la pena seguir las convenciones derivadas de RFC1766 para el lenguaje LOCAL.

Los motores de búsqueda en realidad tienden a hacer un buen trabajo al tratar con la negociación de contenido, por cierto, por lo que no es necesario que tengas URI separados para el mismo contenido en diferentes idiomas. Google Japón rastreará con ja-JP como el encabezado del idioma de aceptación, por ejemplo.

+0

En cuanto a los motores de búsqueda, debe emitir los atributos "lang" y "dir" en el elemento "html". Prefiero el método de cookie, que se puede tratar en Global.código asax (o incluso incluido en una clase base HttpApplication para automatizar completamente cualquier sitio web MVC o ASPX) guardando una cookie "cultural" en AquireRequestState (con el navegador o el idioma predeterminado del sitio web) que es fácil cambiar a cualquier preferencia a través de un método de aplicación "SetLanguage" que simplemente cambia la cultura de la cookie y el hilo. Luego, el sitio funciona sin URL diferentes y el contenido es válido (identifica su idioma). –

Cuestiones relacionadas