Mehrsprachigkeit mit Subdomains und Symfony

Bei einem Projekt benötigte ich die Möglichkeit mehrere Sprachversionen über Subdomains zu ermöglichen. Bekannt ist dieses System von Wikipedia: de.wikipedia.org beheimatet die deutschsprachige Wikipedia, unter en.wikipedia.org ist die englischsprachige Wikipedia zu Hause und so gibt es für alle unterstützte Sprachen eine Subdomain.

Für Mehrsprachigkeit bietet Symfony ja schon einiges an Möglichkeiten (The Definitive Guide to symfony – Chapter 13 – I18n And L10n). Mittels der Methode setCulture kann einem Besucher eine “Sprache” zugeordnet werden und mit Hilfe von XLIFF-Dateien können verschiedene Sprachversionen der Webseite angelegt werden. Was also nur noch fehlt ist eine Möglichkeit die “Culture” entsprechend der Subdomain zu setzen.

Den entsprechenden Hinweis bietet dabei das Askeet-Tutorial Tag 18. Ein Filter ermöglicht vor Ausführung des Controllers eigenen Code auszuführen. Dort können wir den Hostnamen auslesen und entsprechend der Subdomain die “Culture” des Besuchers setzen.

In einzelnen Schritten bedeutet dies also:

1. Filter deklarieren in /projekt/apps/frontend/config/filters.yml


languageFilter:

  class: languageFilter

2. Filter Klasse anlegen in /projekt/apps/frontend/lib/languageFilter.php

class languageFilter extends sfFilter

{

  public function execute($filterChain)

  {

     if($this->isFirstCall())

     {

       $hostname = $this->getContext()->getRequest()->getHost();

       if($pos = strpos($hostname, '.'))

       {

          $language = substr($hostname, 0, $pos);

          $this->getContext()->getUser()->setCulture($language);

       }

     }

     $filterChain->execute();

  }

}

Was passiert im Code? Mittels $this->isFirstCall() wird überprüft ob dies der erste Aufruf des Filters ist, denn durch die Nutzung von forward() im Controller wird der Filter sonst jedes mal ausgeführt, dies ist allerdings nicht nötig.

Mittels strpos und substr wird überprüft ob der Hostname einen Punkt “.” enthält und falls ja wird alles vor dem ersten Punkt extrahiert und als “Culture” gesetzt.

Damit die Kette von Filtern nicht unterbrochen wird muss ein Filter immer mit $filterChain->execute(); enden, damit der nächste Filter ausgeführt wird.

Dieser Code soll nur kurz die Möglichkeit skizzieren. Für eine sinnvolle Nutzung fehlen noch ein paar Elemente:

  • In den meisten Fällen dürfte nicht jede Subdomain sinnvoll sein und sollte daher auch nicht zugelassen sein. Ein Abgleich mit einer Liste von ‘erlaubten’ Subdomains sollte dabei helfen.
  • Man sollte sich überlegen was in Fällen passiert in denen keine Subdomain definiert ist. Möglichkeiten wäre eine Sprachauswahl-Seite oder eine automatische Weiterleitung auf eine Sprachversion.
http%3A%2F%2Fwww.anti-hype.de%2F2008%2F01%2F14%2Fmehrsprachigkeit-mit-subdomains-und-symfony& layout=standard&show-faces=true&width=500& action=like&colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:500px; height:60px">

Kommentieren?

Dein Kommentar