Retrieved from "http://www.julian-fietkau.de/blog/sprachfunktionen_umgestaltet"

Umgestaltung der Sprachfunktionen meiner Webseite

2010-12-27 23:01:43

keywords: language, website

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.

Comments

Please DO NOT enter anything into the next three fields, they are used as bait for automated entries. If any of the following fields is not left empty, the comment will not be saved!




End of protection - from here on, you can safely enter data.

Comments may be formatted using Markdown.

emphasis *emphasis* or _emphasis_
strong emphasis **strong emphasis** or __strong emphasis__
new paragraph insert an empty line

quote

> quote
  • unordered
  • list
* unordered
* list
  1. ordered
  2. list
1. ordered
2. list
weblink [weblink](http://www.julian-fietkau.de)
Note: You can only post weblinks if you are authenticated via OpenID.
More and longer examples are available at Daring Fireball.
TieKei
TieKei (via myopenid.com)
2010-12-28 15:30:01

nettes Konzept, ich hatte bisher nicht die Gelegenheit mich mit den HTTP-Statuscodes auseinander zu setzen, klingt aber sehr spannend. Da werden dich demnächst ein paar Fragen erwarten :P Aber um auch mal etwas Kritik anzubringen: 1) Das OpenID Login Feld sieht unschön aus, wennn man noch nicht eingeloggt ist. 2) Ich finde es immer schöner, wenn der Quellcode dem Anwender auch korrekt eingerückt ausgeliefert wird. Diese Seite soll ja als Vorbild dienen (unterstelle ich dir mal) und da möchtest du auch gern in der Quelltext-Konvention vorbildlich sein ;)

Viele Grüße!

TieKei
TieKei (via myopenid.com)
2010-12-28 15:30:39

3) Die Zeilenumbrüche hier im Kommentarfeld werden nicht berücksichtigt :/

Julian F.
Julian F. (via julian-fietkau.de)
2010-12-28 16:47:58
  1. Hmja, mir gefällt es auch nicht so richtig. Allerdings ist mir keine gute Idee gekommen bisher, wie man das noch sauberer machen könnte. Was würdest du denn ändern wollen?
  2. Du meinst korrekt eingerücktes HTML, so mit einer Einrückungsebene Pro Tag-Verschachtelung? Finde ich realitätsfern, ehrlich gesagt. Meine Templates bauen teilweise darauf auf, dass Quelltextteile an mehreren Stellen eingesetzt werden und dann theoretisch unterschiedlich eingerückt werden müssten. Ich bemühe mich um einigermaßen sinnvolle Strukturierung mit Leerzeilen und rücke mitunter mal innerhalb einzelner Blöcke ein, aber eine dokumentweit konsistente Einrückung ist technisch gar nicht so einfach möglich (höchstens als Ausgabefilter der ganz am Ende noch mal drüberläuft, aber das scheint mir doch CPU-Verschwendung zu sein).
  3. Einzelne Zeilenumbrüche werden ignoriert, das ist By Design(TM) und in Markdown so üblich. Man soll seinen Text ja auch in Editoren schreiben können, die nur eine bestimmte Zeilenbreite zulassen, oder ihn per Mail versenden können, ohne ihn unbeabsichtigt mit Zeilenumbrüchen zu sprenkeln. Einen neuen Absatz machst du mit zwei Zeilenumbrüchen, genau wie auch bei z.B. den meisten Wikis. Falls du ganz unbedingt einen einfachen Zeilenumbruch willst, geht das m.W. mit zwei Leerzeichen am Ende einer Zeile.

Danke für das Feedback, mit weiteren Fragen zur Technik nur immer raus. :)