2012-03-28 8 views
1

Menschen, ich bin bei der Entwicklung einer asp.net Website mit einem Multilanguage Inhalt und SEO ist eine sehr hohe Priorität.Asp.net Multilanguage Websites - separate Verzeichnisse vs URL-Routing

Ich habe es geschafft, dass meine Website verschiedene URLs über das asp.net-URL-Routing anzeigt, um site.com/ar und site.com/en anzuzeigen, abhängig von der ausgewählten Sprache, und dies funktioniert gut auf der .apsx-Seite im Stammverzeichnis Verzeichnis. Dies funktioniert jedoch nicht auf Seiten in Unterverzeichnissen, zum Beispiel site.com/de/Account/Login.aspx, und ich habe tagelang versucht, mein URL-Routing so zu gestalten, dass es mit meinen Unterverzeichnissen funktioniert, aber ich konnte es nicht zur Arbeit bringen Unterverzeichnisse.

Also von der-Easy-Way-Sicht ist es besser, verschiedene physische Verzeichnisse/ar und/en in meinem Stammverzeichnis mit verschiedenen Inhaltsseiten für jede Sprache zu haben. Dies wird auch bevorzugt, da das Layout für/ar-Seite vollständig horizontal umgedreht wird, weil ar = Arabisch = Sprache von rechts nach links.

Bitte teilen Sie Ihre Meinungen zu den Vorteilen Nachteile dieses Ansatzes.

Antwort

1

Der URL-basierte Ansatz sollte auch in Unterverzeichnissen korrekt funktionieren. Da Sie "Unterverzeichnisse" und nicht "Controller/Aktionen" erwähnen, gehe ich davon aus, dass Ihre Anwendung mit ASP.NET WebForms und nicht mit MVC implementiert wurde.

Wenn dies so ist, URL, die Sie Ihre Wünsche in Ihrem Application_BeginRequest umschreiben:

public void Application_BeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     HttpContext ctx = app.Context; 

     string PathAndQuery = ctx.Request.Url.PathAndQuery; 

     // parse the PathAndQuery and if it is of the form 
     // en/Subdir1/Subdir2/resource.aspx 
     // split it into [en] (virtual part) and [Subdir1/Subdir2/resource.aspx] (physical part) 

     string VirtualPart = GetVirtualPart(PathAndQuery); 
     string PhysicalPart = GetPhysicalPart(PathAndQuery); 

     ctx.RewritePath(PhysicalPart); 
    } 

Mit einem solchen Ansatz, Sie haben Ihre physikalische Struktur im Dateisystem und Anfragen des Formulars en\Subdir1\Subdir2\resource.aspx werden Subdir1\Subdir2\resource.aspx korrekt verlegt.

Obwohl das Beispiel das manuelle Neuschreiben zeigt, können Sie jede vorhandene Neuschreibtechnologie verwenden, wenn sie Ihren Anforderungen entspricht.

Dies ist nur, um loszulegen. Wenn Sie jedoch spezifische Probleme bei der Implementierung des URL-Umschreibens haben, nehme ich an, dass Sie andere spezifische Fragen stellen müssen, damit die Leute Ihnen bei bestimmten Problemen helfen können. Wenn Sie einfach sagen Ich habe Tage verbracht und es funktioniert nicht dann ist es unmöglich, Ihnen mit Ihrem spezifischen Ansatz zu helfen.

0

Persönlich würde ich physische Verzeichnisse vermeiden und für den Routing-Ansatz gehen. Es wird viel einfacher sein, Sprachen in der Zukunft hinzuzufügen, und wenn Sie feststellen, dass Sie Kulturen unterstützen müssen (en-US, en-CA, en-GB usw.), können Sie einfach Standardkulturen einführen (dh. Wenn es keine gibt en-GB-Ressource, Standard auf en-US) anstatt eine zweite physische Kopie der Assets zu erstellen. Ich habe auf großen Websites mit doppelten Dateien in lokalisierten Verzeichnissen gearbeitet. Es beginnt schnell zu schmerzen, wenn Sie Sprachen hinzufügen.

Für das Problem mit Routen und Unterverzeichnissen könnten Sie versuchen, eine Konstante in die Route zu setzen, da dies es einer URL erleichtert, das Muster anzupassen.Ich bin mit 'X' hier:

routes.Add("LocalisedRoute", new Route 
    (
     "{lang}/X/{path}" 
     , new IRouteHandler() 
    )); 

nun beide Pfade übereinstimmen sollte:

  • site.com/en/X/Account/Login.aspx
  • site.com/ en/X/Default.aspx

das ist nicht notwendig sein kann, wenn man den Ansatz in @TonyStark ‚s Link skizzierte nehmen, aber im allgemeinen ich gefunden habe, um eine konstante Zugabe nützlich zu sein, wenn sie mit Routen in der das Hantieren Vergangenheit.

EDIT: Beachten Sie, dass Google's recommendation ist eine Sub-Domain für jede Sprache zu verwenden, zB. de.usite.com.