Umgestaltung der Sprachfunktionen meiner Webseite

Sie lesen einen älteren Blogeintrag. Bitte beachten Sie, dass die hierin enthaltenen Informationen technologisch veraltet sein können. Dieser Text spiegelt nicht unbedingt meine aktuellen Meinungen oder Fähigkeiten wider.

Dies ist die originale deutsche Version dieses Textes. Er ist auch als englische Übersetzung verfügbar.

27. Dezember 2010

Die Weihnachtstage sind eine Zeit für viele schöne Dinge: alte Freunde treffen, mit der Familie zusammen sein, gut essen, ausschlafen. Ich klinke mich in dieser Zeit gerne ein wenig aus den meisten Uni-Pflichten aus und betreibe ein wenig Programmierung für eigene Zwecke. Die letzten zwei, drei Tage habe ich mich meiner Webseite gewidment und die technische Grundlage für die Internationalisierung generalüberholt.

Wichtige Änderungen

Zuerst vielleicht mal das, was sich für Besucher der Seite ändert. Die auffälligste Änderung: Es gibt keinen „Implizite-Sprache-Modus“ mehr, sondern jeder Besucher befindet sich jederzeit entweder auf der deutschen oder der englischen Version der Seite. (Daran, dass nur auf deutsch verfügbare Inhalte auch auf der englischen Seite auf deutsch angezeigt werden, ändert sich hierdurch nichts.) Ihr merkt das daran, dass ihr beim Besuch der Seite auf eine Subdomain umgeleitet werdet, entweder de.julian-fietkau.de oder en.julian-fietkau.de, je nach Spracheinstellung des Browsers. Umschalten könnt ihr wie gehabt über die Flagge in der Fußleiste.

Die Links sehen ein wenig anders aus. Statt einer Sprachangabe am Ende des Links (früher: „http://www.julian-fietkau.de/blog/en“) wird die Sprache jetzt über die Subdomain spezifiziert (neu: „http://en.julian-fietkau.de/blog“). Analoges gilt für Direktlinks auf Dateien, soweit sie überhaupt zugelassen sind. Der präferierte Link zur Weitergabe ist nach wie vor der mit dem „www“ ohne Sprache, so dass jeder Besucher des Links die Sprache bekommt, die er lieber haben möchte. Jeder Link ist auch mit „www“ statt „de“ oder „en“ möglich und führt dann die entsprechende Weiterleitung durch.

Das ist im Grunde auch schon alles. Ich schreibe mal noch ein wenig dazu, warum ich das gemacht habe und wie das umgesetzt ist. Warnung vorweg: Hier spricht mal wieder hauptsächlich der Programmierer.

Eindeutigkeit von URLs

Ich war schon seit dem Launch dieser Version meiner Seite ein wenig unzufrieden damit, dass gängige Suchmaschinen zunächst die englischen Versionen meiner Unterseiten indiziert hatten und die deutschen dann nur über die explizite Angabe der Sprache verfügbar waren. Es scheint eine schlechte Idee zu sein, per Auswertung der Spracheinstellung mehrere sprachliche Versionen des Inhalts unter der selben URL verfügbar zu machen. Ist zwar schön, wenn Benutzer einfach die Adresse aus ihrem Browser kopieren und verteilen können, aber irgendwie ist diese dynamische Anpassung der Sprache einer URL doch etwas zu nichtdeterministisch für ein funktionierendes Web und geht entgegen der Konventionen.

In der jetzigen Lösung hat jede URL, hinter der Inhalt liegt, eine eindeutige und explizite Sprache. Alle anderen sind Weiterleitungen, die ggf. die Spracheinstellung des Benutzers bei der Auswahl des Weiterleitungsziels berücksichtigen. Das „xml:lang“-Attribut wird nun übrigens auch korrekt gesetzt.

Über HTTP-Statuscodes

Ich stand vor der Herausforderung, die Struktur so zu implementieren, dass die neuen Links alle funktionieren und die alten weiterhin funktionstüchtig bleiben. Man weiß ja nie, wer sich evtl. irgendwelche Bookmarks gesetzt hat oder wo die URLs überall stehen. Dass die alten weiterhin funktionieren, war mir also schon ziemlich wichtig. In diesem Sinne wird jeder Besucher einer alten URL mit expliziter Sprachangabe per „301 Moved Permanently“ auf die neue Adresse weitergeleitet, ohne sich daran großartig stören zu müssen.

Die andere große Frage war, was ich mit den Besuchern einer Seite ohne Sprachangabe jetzt mache. Einfach irgendwelchen Inhalt rausgeben wollte ich ja nicht mehr. Nachdem ich ermittelt habe, ob sie lieber „de“ oder „en“ haben wollen, werden sie deshalb jetzt per „303 See Other“ auf ihre Sprachversion weitergeleitet. Dadurch bringe ich laut Wikipedia im Gegensatz zu einem 301 unter Anderem zum Ausdruck: „The specified URI is not a substitute reference for the original resource.“ Soll heißen: „Hey Besucher! Das, was du angefragt hast, kannst du persönlich am besten stattdessen hier finden, aber das gilt nicht unbedingt für den Rest der Welt gleichermaßen.“

Die verflixten Kleinigkeiten

Ohne allzu sehr über langweilige Interna zu sprechen, kann ich sagen, dass die meiste Zeit mal wieder der Kleinkram verschlungen hat. Ich musste an vielen Stellen die Templates anpassen und vor allem der OpenID-Login war die letzten zwei Tage komplett kaputt. Jetzt sollte hoffentlich alles wieder gehen. Falls ihr über irgendwelche Bugs oder andere Auffälligkeiten stolpert, sagt mir gerne bescheid!

P.S. Noch eine knappe Stunde lang könnt ihr die Weihnachtsdeko bewundern, danach verschwindet sie bis nächsten Dezember.