2008-11-14 9 views
9

Lors de la création d'un site Web multilingue (avec des formulaires Web ASP.NET), je vais utiliser un module HTTP pour réécrire les URL afin d'obtenir quelque chose d'amical (pour les humains & moteurs) comme:Sites Web multilingues avec 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 

Mon (débutant) compréhension du MVC est que l'URL doit prendre le format de

contrôleur/action/Identificateur

donc répliquer la fonctionnalité ci-dessus avec MVC va se retrouver avec des URL similaires à:

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

Questions ..

  • Puis-je insérer un code de pays dans l'URL avant que le segment « contrôleur »?
  • Est-il possible de mapper des 'produits' et des 'produits' sur le même contrôleur?

Merci pour votre aide

Edit: En plus de la réponse de Panos ci-dessous j'ai trouvé plus d'informations sur le ASP.NET Website.

Répondre

12

L'URL peut prendre presque n'importe quelle autre forme que vous aimez. Pour plus d'informations, vérifiez ASP.NET MVC Framework (Part 2): URL Routing. Juste pour commencer (car je ne suis pas sûr que ce soit la meilleure solution), vous pouvez ajouter deux nouvelles routes dans votre 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 = "" } 
     ); 

Ces itinéraires comprennent les URL suivantes (et la carte tous les deux à la ActionResult Category(string id, string subcategory) méthode de ProductsController):

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

Si vous voulez créer ces URL dans votre point de vue, vous pouvez utiliser quelque chose comme:

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

cela fonctionne-t-il? 'uk/Products/Category/1/A' es/Productos/Category/1/A' Dans ces deux scénarios, il sera dirigé vers la première route' ukRoute' puisque lang est un champ de chaîne et une correspondance. – Saanch

+2

Je pense que la méthode introduite [dans ce blog] (http://blog.maartenballiauw.be/post/2010/01/26/Translating-routes- (ASPNET-MVC-et-Webforms) .aspx) est une meilleure idée . – VahidNaderi

3

vous pouvez le faire, mais Gardez à l'esprit que tous les pays ne sont pas des langues. Par exemple, en-gb est la représentation habituelle de l'anglais britannique, ou plus précisément des paramètres régionaux de la Grande-Bretagne pour le contenu en anglais, par exemple. Si vous le pouvez, cela vaut la peine de suivre les conventions dérivées de RFC1766 pour le langage LOCALE. Soit dit en passant, les moteurs de recherche ont tendance à faire du bon travail en matière de négociation de contenu. Vous n'avez donc pas nécessairement besoin d'avoir des URI distincts pour le même contenu dans différentes langues. Google Japan explorera avec ja-JP comme l'en-tête de la langue d'acceptation, par exemple.

+0

En ce qui concerne les moteurs de recherche, vous devriez émettre les attributs "lang" et "dir" sur l'élément "html". Je préfère la méthode des cookies qui peut être traitée dans le Global.Asax code (ou même enveloppé dans une classe de base HttpApplication parent à automatiser complètement pour tout site web MVC ou ASPX) en enregistrant un cookie "culture" à AquireRequestState (avec navigateur ou langue par défaut du site web) qui est facile de changer à n'importe quelle préférence via une méthode d'application "SetLanguage" qui change juste la culture de cookie et de thread. Ensuite, le site fonctionne sans URL différentes et le contenu valide (identifie sa langue). –