Einrichtung von MultiViews-Sprachvereinbarung auf Apache

Frage

Wie setze ich MultiViews auf einem Apache-Webserver ein, um Ressourcen automatisch in der per HTTP-Request angefragten Sprache auszuliefern?

Wenn ein Browser ein Dokument von einem Server anfragt, wird üblicherweise die Information über die vom Nutzer bevorzugten Sprachen im HTTP-Accept-Language-Header zum Server geschickt. Wenn der Server eine Webseite in mehr als einer Sprachversion vorrätig hat, kann diese HTTP-Information dazu benutzt werden, dass der Nutzer die Webseite in seiner bevorzugten Sprache erhält, wenn diese verfügbar ist. Wenn es nur eine Version auf dem Server gibt, wird diese ausgeliefert.

Der Mechanismus, dem Nutzer anhand der Accept-Language-Information im HTTP-Request die für ihn relevante Seite auszuliefern, wird Sprachvereinbarung (engl. language negotiation) genannt.

In vielen Fällen ist die initiale Browsereinstellung in Ordnung. Wenn Sie bspw. eine japanische Browserversion haben, nimmt der Browser üblicherweise an, dass Sie Webseiten auf japanisch bevorzugen und sendet diese Information an den Server. Gängige Browser erlauben Ihnen, die bevorzugten Sprachen zu ändern. Weitere Informationen dazu finden Sie im Artikel Einstellung der bevorzugten Sprachen im Browser.

Es gibt zwei verschiedene Ansätze für Inhaltsvereinbarung auf Apache. Der erste beinhaltet die Verwendung einer Typenzuordnungsdatei (.var-Datei), welche die Dateien mit den Varianten explizit benennt; der zweite beinhaltet die Verwendung einer 'MultiViews'-Suche, wobei der Server einen impliziten Mustervergleich von Dateinamen durchführt und aus den Resultaten auswählt. Die MultiViews-Option kann auch für einzelne Verzeichnisse gesetzt werden, wenn der Serveradministrator das zugelassen hat.

Dieser Artikel behandelt die Frage, wie man beim MultiViews-Ansatz Dokumente auf einem Apache-Server einrichtet, damit Sprachvereinbarung funktioniert.

Antwort

Bedenken Sie zuerst, dass Sprachvereinbarung der beste Ansatz sein kann oder auch nicht, um Ihre mehrsprachigen Inhalte an Ihre Leser zu bringen. In einigen Fällen können lokalisierte Websites bspw. am besten gehandhabt werden, indem man die übersetzten Versionen einer Website in verschiedenen Verzeichnissen voneinander getrennt hält oder indem man beide Ansätze kombiniert. Welcher Ansatz der jeweils passende ist, wird Thema eines zukünftigen Artikels sein.

Die Einrichtung von Sprachvereinbarung beinhaltet

  1. eine Namenskonvention für die Dateien der verschiedenen Sprachversionen zu entwerfen,
  2. sich eine Strategie zu überlegen, auf welche Sprache zurückgegriffen werden soll, wenn Sprachen angefordert werden, die Sie nicht unterstützen, und
  3. die richtigen serverseitigen Direktiven einzurichten, damit alles funktioniert.

Es gibt mehr als einen Weg, Sprachvereinbarung auf Apache-Servern einzurichten, und richtige Ansatz hängt von den Einstellungen auf höherer Ebene und den vom Serveradministrator erteilten oder nicht erteilten Rechten ab. Kontaktieren Sie Ihren Serveradministrator um zu erfahren, welcher Ansatz möglich ist und welche Rechte Sie haben.

Weil sich Server-Konfigurationen auf vielfältige Weise unterscheiden können, ist es schwer, eine einfache definitive Beschreibung zu geben, wie man Sprachvereinbarung einrichtet. Was nun folgt, ist eine Beschreibung eines üblichen Ansatzes. Wir setzen voraus, dass MultiViews angeschaltet ist (das ist die Voreinstellung) und dass der Anwender bestimmte Direktiven in .htaccess-Dateien ändern kann (das sind kleine Textdateien in der Verzeichnisstruktur). AllowOverride muss vom Serveradministrator entsprechend gesetzt sein, damit .htaccess-Dateien Wirkung zeigen. Fragen Sie Ihren Serveradministrator, ob dieser Ansatz in Ihrem Fall machbar ist.

Wir verwenden folgendes Beispiel: Ein Dokument example.html sei in 3 Sprachen verfügbar: englisch, französisch und deutsch, die Voreinstellung sei englisch. Obwohl sich das Beispiel auf .html-Dateien beschränkt, kann Sprachvereinbarung auch bei anderen Dateitypen angewandt werden.

Dateinamen

Jede Sprache wird durch eine spezielle Dateiendung angezeigt, die vor oder nach der Endung .html stehen kann. Bei der Anwendung muss man einige Überlegungen zur Position dieser Dateiendung anstellen.

Wenn die Sprach-Endung als letztes steht, kann die Datei mit oder ohne .html-Endung angefordert werden. Das kann es allerdings erschweren, die Dateien zu lesen oder zu editieren, wenn sie nicht auf einem Apache-Server sind (sondern bspw. von einem anderen Server, einer CD oder der Harddisk gelesen werden). Das kommt daher, dass die meisten Editoren und Browser nur anhand der letzten Dateiendung den Dateitypen bestimmen und wie mit diesem zu verfahren ist. In unserem Beispiel wären die Namen der englischen, französischen und deutschen Dateien wie folgt:

Wenn die .html-Endung als letztes steht, ist es leichter, die Dateien zu lesen oder zu editieren, wenn sie nicht auf einem Apache-Server sind. Um die Ressource von einem Apache-Server abzurufen, muss der Dateiname immer ohne die Dateiendungen in der Adresszeile im Browser eingegeben bzw. in einem Hyperlink angegeben werden (d.h. <a href="example">...</a>). In unserem Beispiel wären die Dateinamen:

Die Sprach-Endungen können beliebige Strings sein, solange ihre Bedeutung auf dem Server definiert wird (siehe unten). Der Server wird vermutlich schon einige zweibuchstabige Sprach-Endungen aus den globalen Einstellungen in seiner httpd.conf-Datei erkennen. Wir empfehlen die Verwendung der ISO-Sprach- und -Ländercodes wie in BCP 47 definiert, denn das gewährleistet bessere Konsistenz und einfache Wiedererkennbarkeit der Sprachkennzeichnungen.

Bei einigen Dateiendungen ist Vorsicht geboten. Die Verwendung des ISO-Codes .pl für Polnisch würde mit der Endung kollidieren, die typischerweise für Perl-Dokumente verwendet wird. Verwenden Sie deshalb pl-PL für Polnisch.

Nutzer können eine spezielle Datei referenzieren, indem sie den vollen Dateinamen angeben, z.B. example.fr.html fordert die französische Version an, unabhängig von den Spracheinstellungen des Nutzers.

Server-Direktiven

Normalerweise verwendet man die AddLanguage-Direktive um anzugeben, welche Dateiendung mit welcher per HTTP für den Inhalt angegebenen Sprache verknüpft ist.

Die folgene Direktive verknüpft z.B. den HTTP-Request nach Inhalt auf Französisch mit der Dateiendung .fr:

AddLanguage fr .fr

Es gibt verschiedene Stellen, wo man dies angeben kann. Es kann bereits durch einen Eintrag in der httpd.conf-Datei des Servers global spezifiziert sein oder ein Serveradministrator kann es dort hinzufügen. Als Alternative dazu kann ein Anwender, der Inhalte hochladen kann, dies in einer Datei in der Verzeichnisstruktur angeben. Solch eine Datei heißt üblicherweise .htaccess.

Default-Dateien

Es ist wichtig, eine Default-Datei festzulegen, denn Nutzer, die weder Englisch noch Französisch noch Deutsch in der Liste ihrer bevorzugten Sprachen haben (z.B. ein spanischer Nutzer), oder deren Nutzerprogramm (Browser) keine Inhaltsvereinbarung unterstützt, würden sonst einen HTTP-Fehler 406 (NOT ACCEPTABLE) anstelle einer Datei erhalten.

Wie man am besten eine Default-Datei festlegt, hängt davon ab, ob die Sprach-Endung vor oder hinter der .html-Endung steht und welche Apache-Version verwendet wird. In den nachfolgenden Beispielen nehmen wir Englisch als Default an (oft die beste Wahl für einen Default angesichts dessen, wie weit verbreitet Englisch ist).

Default-Dateien in Apache ab 2.0.30 festlegen

Ab Version 2.0.30 gibt es auf Apache-Servern eine saubere Lösung, um eine Default-Datei festzulegen: die Direktiven ForceLanguagePriority und LanguagePriority. (Folgen Sie den Links zu ausführlichen Beschreibungen, wie diese Direktiven arbeiten).

Für das obige Beispiel können wir durch folgende zwei Zeilen den Default auf Englisch setzen:

LanguagePriority en fr de
ForceLanguagePriority Fallback

Wenn nun ein spanischer Nutzer ein spanisches Dokument im Kontext unseres Beispiels anfordert, bekommt er stattdessen das englische Dokument ausgeliefert, d.h. das, was als erstes in der LanguagePriority-Liste steht.

Default-Dateien in Apache 1.3.4 bis 2.0.29 festlegen

Wenn die Server-Version älter als 2.0.30 ist, hat man mehr Arbeit damit, die Default-Datei festzulegen, denn die ForceLanguagePriority-Direktive steht nicht zur Verfügung. Das Vorgehen hängt dann davon ab, ob die Sprach-Endung vor oder hinter der .html-Endung steht.

Betrachten wir zuerst den Fall, dass die Sprach-Endung vor der .html-Endung steht (die Ressource also immer ohne die .html-Endung in der Adresszeile im Browser eingegeben bzw. in einem Hyperlink angegeben werden muss). Um Englisch als Default zu setzen, kann man in dem Verzeichnis eine Kopie der englischen Datei unter folgendem Namen erstellen:

example.html

Wenn die Sprach-Endung nach der .html-Endung steht (die Datei also mit oder ohne .html-Endung angefordert werden kann), muss die Kopie der englischen Datei so benannt werden:

example.html.html

Die Endung der Default-Datei ist .html.html, denn wenn die Datei example.html hieße und ein Nutzer sie als example.html anfordern würde, fände keine Inhaltsvereinbarung statt (weil eine exakte Übereinstimmung gefunden wird).

Übrigens

Wenn es in einem Verzeichnis nur eine Datei mit einem bestimmten Namen gibt und sie keine Sprach-Endung hat, dann wird diese ausgeliefert, unabhängig von den bevorzugten Sprachen des Nutzers.

Diese Technik kann auch für andere Dateitypen als HTML angewandt werden. Wir haben HTML hier als Beispiel verwendet, weil dies ein oft auftretender Fall ist.