Rolf B: Sprachsteuerung

Beitrag lesen

Hallo Steffi,

ich nehme an, du sprichst aus der Sicht des Seitenbetreibers von www.example.com.

Ausgangsbasis ist der accept-language Header, den der Browser mitschickt. Der wird vom Browser basierend auf Anwendereinstellungen generiert, nicht basierend auf dem Land, in dem der Browser läuft. Aber ich nehme an, das weißt Du.

Bei statischen Seiten in Apache kann man das über Einstellungen im Webserver lösen. Mit PHP zusammen ist es nicht ganz so einfach.

Es gibt DUMME Beispiele, die mit RewriteCond arbeiten, worin sie dann testen, ob "de" oder "en" im accept-language Header des Webrequests vorkommt. Das missachtet aber die q-Gewichte im Header, und wenn Dir jemand "accept-language: en;q=1.0,de;q=0.9" schickt, Du aber zuerst auf de testest, lieferst Du die Seite gegen den Willen des Besuchers auf deutsch

Ich nehme an, dass Du im Root-Ordner des Projekts eine index.php hast. Surft jemand "https://www.example.com" an, sollte die als Defaultpage eingetragen sein. Darin kannst Du den accept-language Header interpretieren. Dafür gibt es gute und schlechte Lösungen.

  • Schlecht: Suche darin nach "de"
  • Besser: Verwende locale_accept_from_http(). Nachteil: die Funktion verwendet alle auf dem Computer installierten Locales, nicht das, was Dein Projekt unterstützt.
  • Vermutlich gut: Auf der locale_accept_from_http Seite verweist ein Kommentator auf die Negotiation-Klasse von William Durand. Der kannst Du dann deine unterstützten Sprachen mitgeben und er pickt aus accept-language die heraus, die dem Anwender am besten gefällt.

Wenn Du allerdings die Seiten https://www.example.com/de/foo.php und https://www.example.com/fr/foo.php im Angebot hast, und jemand ruft https://www.example.com/foo.php ab, dann musst Du entweder eine schlaue Error-Page vorsehen oder für jede sprachspezifische PHP Datei eine Weiche vorsehen.

Eine Alternative ist, gar keine sprachabhängigen URLs zu haben. Statt dessen erstellst Du eine Rewrite-Rule, die jeden Abrufpfad auf deiner Seite (außer denen, die auf statische Ressourcen führen), auf ein /index.php umleitet. Nach außen hin bietest Du URLs an wie https://www.example.com oder https://www.example.com/foo oder https://www.example.com/bar?q=hugo. Und die Rewrite-Rule leitet das nach index.php, index.php?page=foo oder index.php?page=bar&q=hugo. In index.php wertest Du den Sprachheader aus und delegierst den Abruf dann zur richtigen Seite. Aber nicht zu jeder beliebigen, das ist ein Security-Loch, du musst eine Whitelist von erlaubten page-Werten vorsehen.

Soweit die Helikoptersicht, wenn Du weitere Infos brauchst, frag gerne nach.

So würde ich es jedenfalls machen, ich bin aber nicht unbedingt der PHP-Gott 😉

Rolf

--
sumpsi - posui - obstruxi