Meilleure façon de gérer les URL dans un site multilingue en ASP.net
-
01-07-2019 - |
Question
Je dois créer un site Web multilingue, avec des URL telles que
.www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
Auparavant, je configurais deux répertoires virtuels dans IIS, puis détectais l'URL dans global.aspx et changeais la langue en fonction de l'URL
.Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim lang As String
If HttpContext.Current.Request.Path.Contains("/en/") Then
lang = "en"
Else
lang = "es"
End If
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)
End Sub
La solution s'apparente davantage à un hack. Je songe à utiliser le routage pour un nouveau site Web.
Connaissez-vous un moyen plus efficace ou plus élégant de le faire?
modifier: la question concerne la gestion des URL, pas les ressources, etc.
La solution
J'ai décidé de choisir le nouveau routage ASP.net.
Pourquoi ne pas écrire? Parce que je ne veux pas changer l'URL propre que le routage vous donne.
Voici le code:
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Code that runs on application startup
RegisterRoutes(RouteTable.Routes)
End Sub
Public Sub RegisterRoutes(ByVal routes As RouteCollection)
Dim reportRoute As Route
Dim DefaultLang As String = "es"
reportRoute = New Route("{lang}/{page}", New LangRouteHandler)
'* if you want, you can contrain the values
'reportRoute.Constraints = New RouteValueDictionary(New With {.lang = "[a-z]{2}"})
reportRoute.Defaults = New RouteValueDictionary(New With {.lang = DefaultLang, .page = "home"})
routes.Add(reportRoute)
End Sub
Ensuite, classe LangRouteHandler.vb:
Public Class LangRouteHandler
Implements IRouteHandler
Public Function GetHttpHandler(ByVal requestContext As System.Web.Routing.RequestContext) As System.Web.IHttpHandler _
Implements System.Web.Routing.IRouteHandler.GetHttpHandler
'Fill the context with the route data, just in case some page needs it
For Each value In requestContext.RouteData.Values
HttpContext.Current.Items(value.Key) = value.Value
Next
Dim VirtualPath As String
VirtualPath = "~/" + requestContext.RouteData.Values("page") + ".aspx"
Dim redirectPage As IHttpHandler
redirectPage = BuildManager.CreateInstanceFromVirtualPath(VirtualPath, GetType(Page))
Return redirectPage
End Function
End Class
Enfin, j'utilise le fichier default.aspx à la racine pour rediriger vers le langage par défaut utilisé dans la liste du navigateur.
Cela peut peut-être être fait avec route.Defaults, mais cela ne fonctionne pas dans Visual Studio (peut-être que cela fonctionne sur le serveur)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim DefaultLang As String = "es"
Dim SupportedLangs As String() = {"en", "es"}
Dim BrowserLang As String = Mid(Request.UserLanguages(0).ToString(), 1, 2).ToLower
If SupportedLangs.Contains(BrowserLang) Then DefaultLang = BrowserLang
Response.Redirect(DefaultLang + "/")
End Sub
Quelques sources:
* Mike Ormond's blog
* Blog de Chris Cavanagh .
* MSDN
Autres conseils
- Utilisez urlrewriteing.net pour les formulaires Web asp.net ou effectuez un routage avec mvc. Rewrite www.site.com/fr/something.aspx en url: page.aspx? Lang = fr.
UrlRewriteing.net peut être facilement configuré via regex dans web.config. Vous pouvez également utiliser le routage avec les formulaires Web maintenant, il est probablement similaire ... - avec les formulaires Web, laissez chaque page aspx hériter de la classe BasePage, qui hérite ensuite de la classe Page.
Dans BasePage, remplacez la classe "InitializeCulture ()". et définissez les informations de culture sur thread, comme vous l'avez décrit dans la question.
C’est bien de faire cela dans cet ordre: 1. vérifier l’URL pour Lang param, 2. vérifier le cookie, 3. définir la langue par défaut - Pour le contenu statique (texte, URL de photos) sur les pages, utilisez LocalResources ou Global si le contenu se répète sur l'ensemble du site. Vous pouvez regarder une diffusion vidéo en utilisant la résolution globale / locale. sur www.asp.net
- Préparez la base de données pour plusieurs langues. Mais c'est une autre histoire.
J'utilise personnellement les fichiers de ressources .
Très efficace, très simple.
UrlRewriting est la voie à suivre.
Il existe un bon article sur MSDN sur les meilleures façons de le faire.
Un peu comme une tangente, mais j’éviterais en fait de choisir des chemins différents, à moins que les différentes langues ne soient complètement distinctes les unes des autres.
Pour le classement Google ou les utilisateurs partageant des URL (l’un des gros avantages des URL "nettes"), vous souhaitez que l’adresse reste aussi constante que possible.
Vous pouvez rechercher les préférences de langue des utilisateurs à partir des paramètres de leur navigateur:
CultureInfo.CurrentUICulture
Ensuite, votre URL pour l'anglais ou l'espagnol:
www.domain.com/products/newproduct
Même adresse pour n'importe quelle langue, mais l'utilisateur obtient la page dans la langue de son choix.
Nous l'utilisons au Canada pour fournir des systèmes en anglais et en français simultanément.
Pour ce faire avec le routage d'URL, reportez-vous à ce message:
Surveillez également le nouvel IIS 7.0 - Réécriture d’URL. Excellent article ici http: // learn. iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
J'ai aimé cette partie Quelle option devriez-vous utiliser?
-
Si vous développez une nouvelle application Web ASP.NET utilisant les technologies ASP.NET MVC ou ASP.NET Dynamic Data, utilisez le routage ASP.NET. Votre application bénéficiera de la prise en charge native des URL propres, y compris la génération d’URL propres pour les liens de vos pages Web. Notez que le routage ASP.NET ne prend pas encore en charge les applications Web Forms standard, bien qu'il soit prévu de le prendre en charge ultérieurement.
-
Si vous possédez déjà une application Web ASP.NET existante et que vous ne souhaitez pas le modifier, utilisez le module de réécriture d'URL. Le module de réécriture d'URL vous permet de traduire les URL conviviales pour les moteurs de recherche dans un format que votre application utilise actuellement. En outre, il vous permet de créer des règles de redirection pouvant être utilisées pour rediriger les robots d'exploration des moteurs de recherche afin de nettoyer les URL. http://learn.iis.net /page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Merci, Maulik.