2008-09-17 9 views
7

je dois faire un site Web multilingue, avec urls commeLa meilleure façon de gérer les URL d'un site multilingue ASP.net

www.domain.com/en/home.aspx for english 
www.domain.com/es/home.aspx for spanish 

Dans le passé, je mis en place deux répertoires virtuels dans IIS, puis détecter l'URL dans global.aspx et changer 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 est plus comme un hack. Je pense à utiliser Routing pour un nouveau site web.

Connaissez-vous une façon meilleure ou plus élégante de le faire?

modifier: La question concerne la gestion des URL, pas de ressources, etc.

Répondre

7

j'ai décidé d'aller avec le nouveau ASP.net routage.
Pourquoi ne pas écrire en url? 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 

Puis 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'utiliser le default.aspx à la racine pour rediriger vers la valeur par défaut lang utilisé dans la liste du navigateur .
Peut-être que cela peut être fait avec la route.Par défaut, mais ne fonctionnent pas dans Visual Studio (peut-être 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
* Chris Cavanagh’s Blog
* MSDN

0

J'utilise the resources files personnellement.

Très efficace, très simple.

+0

euhh? Nous parlons de gérer les URL et de cartographier dans une langue spécifique. –

+0

Oui, mais avec les fichiers de ressources, vous n'avez pas à mapper les URL aux langues, donc, le problème a été résolu. – thomasb

1
  1. Utilisez urlrewriteing.net pour les webforms asp.net ou le routage avec mvc. Réécrivez www.site.com/fr/quelquechose.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 des formulaires Web maintenant, c'est probablement similaire ...
  2. avec des formulaires Web, laissez chaque page ASPX hériter de la classe BasePage, qui hérite alors de la classe Page.
    Dans la classe BasePage, remplacez "InitializeCulture()" et définissez les informations de culture sur thread, comme décrit dans la question. Il est bon de le faire dans cet ordre: 1. vérifier l'URL pour le paramètre Lang, 2. vérifier le cookie, 3. définir le langage par défaut
  3. Pour le contenu statique (texte, URL des photos) sur les pages, utilisez LocalResources ou Global si le contenu répète à travers le site. Vous pouvez regarder la vidéo sur l'utilisation de res/global res. sur www.asp.net
  4. Préparez la base de données pour plusieurs langues. Mais c'est une autre histoire.
0

Type d'une tangente, mais En fait, j'éviterais de faire cela avec des chemins différents à moins que les différentes langues ne soient complètement séparées les unes des autres.

Pour le classement Google ou pour les utilisateurs partageant des URL (l'un des principaux avantages des URL «propres»), vous souhaitez que l'adresse reste la plus constante possible.

Vous pouvez trouver les préférences linguistiques des utilisateurs de leurs paramètres du 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 choisie.

Nous utilisons ceci au Canada pour fournir des systèmes en anglais et en français en même temps.

+0

Je ne suis pas d'accord. 1. Votre contenu ne sera jamais spidered dans les deux langues. 2. Vous ne pouvez pas partager une URL dans une langue spécifiée. –

+0

Donc, dans votre exemple initial devrait-il être www.domain.com/es/casa.aspx pour l'espagnol? – Keith

+0

Non, le nom de l'URL sera le même (en fait, c'est le même fichier) mais le contenu et les balises meta seront en espagnol afin que les gens puissent trouver la recherche de contenu espagnol ou anglais. BTW, Accueil sera plus comme Inicio que Casa :) –

0

Aussi, attention nouvelle IIS 7.0 - URL Rewriting. Excellent article ici http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

J'ai aimé cette partie Quelle option devez-vous utiliser?

  1. Si vous développez une nouvelle application Web ASP.NET qui utilise soit ASP.NET MVC ou ASP.NET Dynamic Data Technologies, utiliser le routage ASP.NET. Votre application bénéficiera d'un support natif pour les URL propres, y compris la génération d'URL propres pour les liens dans 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 à l'avenir.

  2. Si vous disposez déjà d'une application Web ASP.NET héritée et que vous ne souhaitez pas la modifier, utilisez le module de réécriture d'URL. Le module de réécriture d'URL vous permet de traduire les URL compatibles avec 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 qui peuvent être utilisées pour rediriger les robots des moteurs de recherche vers des URL de nettoyage. http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

Merci, Maulik.

Questions connexes