Modo migliore per gestire gli Url in un sito multilingua in ASP.net
-
01-07-2019 - |
Domanda
Ho bisogno di fare un sito web multilingue, con un url del tipo
www.domain.com/en/home.aspx for english
www.domain.com/es/home.aspx for spanish
In passato, vorrei impostare due directory virtuale in IIS e quindi rilevare l'URL globale.aspx e cambiare la lingua in base all'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 soluzione è più simile a un hack.Sto pensando di usare il Routing per un nuovo sito web.
Conoscete un modo più elegante per farlo?
edit:La domanda è la gestione degli URL, non sulle risorse, etc.
Soluzione
Ho deciso di andare con il nuovo ASP.net Routing.
Perché non urlRewriting?Perché io non voglio cambiare il clean URL routing dà a voi.
Ecco il codice:
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
Quindi LangRouteHandler.vb classe:
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
Infine, io uso il default.aspx nella root reindirizzare il default lang utilizzato nel browser elenco.
Forse questo può essere fatto con il percorso.Impostazioni di default, ma non funzionano all'interno di Visual Studio (magari funziona nel server)
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
Alcune fonti:
* Mike Ormond blog
* Chris Cavanagh Blog
* MSDN
Altri suggerimenti
- Utilizzare urlrewriteing.net per asp.net webforms, o di routing con mvc.Riscrivere www.site.com/en/something.aspx l'url:pagina.aspx?lang=it.
UrlRewriteing.net può essere facilmente configurato tramite regex nel web.config.È inoltre possibile utilizzare il routing con webforms ora, probabilmente simile... - con moduli web, che ogni pagina aspx eredita da BasePage classe che eredita dalla classe Page.
In BasePage classe override "InitializeCulture()" e impostare la cultura info per il thread, come è descritto nella domanda.
È bene farlo in questo ordine:1.controllare url Lang param, 2.controllare cookie, 3.set default lang - Per i contenuti statici (testo, foto url) su pagine LocalResources,Globale o se il contenuto è ripetuta in tutto il sito.È possibile guardare videocast sull'utilizzo globale/locale res.su www.asp.net
- Preparare db per più lingue.Ma questa è un'altra storia.
Ho personnaly uso il file di risorse.
Molto efficiente, molto semplice.
UrlRewriting è la strada da percorrere.
C'è un bell'articolo su MSDN sui modi migliori per farlo.
Una sorta di tangente, ma mi piacerebbe davvero evitare di fare questo con percorsi diversi, a meno che le diverse lingue sono completamente contenuti separate le une dalle altre.
Per la classifica di Google, o per gli utenti di condividere Url (uno dei grandi vantaggi di "pulito" Url), si desidera che l'indirizzo di rimanere il più possibile costante.
Si possono trovare utenti preferenze di lingua da loro impostazioni del browser:
CultureInfo.CurrentUICulture
Allora il vostro URL per l'inglese o spagnolo:
www.domain.com/products/newproduct
Stesso discorso per qualsiasi lingua, ma l'utente ottiene la pagina nella lingua scelta.
Usiamo questo in Canada per fornire sistemi in francese e in inglese allo stesso tempo.
Per fare questo con URL Routing, fare riferimento a questo post:
Inoltre, guardare fuori nuovi IIS 7.0 - la Riscrittura degli URL.Ottimo articolo qui http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Mi è piaciuta questa parte Quale Opzione Si Dovrebbe Utilizzare?
Se si sta sviluppando un nuovo ASP.NET applicazione Web che utilizza ASP.NET MVC o ASP.NET Dati Dinamici tecnologie, uso ASP.NET routing.L'applicazione del beneficio dal supporto nativo per i clean Url, compresa la generazione di pulire la Url per il link nelle tue pagine Web.Nota che ASP.NET routing non supporta lo standard di applicazioni Web Form di sicurezza, anche se ci sono piani per il futuro.
Se si dispone già di una eredità ASP.NET applicazione Web e non la voglio cambiare, utilizzare l'URL-rewrite module.La URL-rewrite module consente di tradurre search-engine friendly Url in un formato che l'applicazione utilizza attualmente.Inoltre, permette di creare delle regole di reindirizzamento che può essere utilizzato per reindirizzare i motori di ricerca crawler per pulire gli Url.http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
Grazie, Maulik.