Ich möchte hier den grundlegenden Aufbau einer mehrsprachigen Internetseite zeigen. Das Grundgerüst wird mit HTML, CSS und PHP realisiert.
Features
- Browser-Spracherkennung
- Sprachüberprüfung
- Sprachspeicherung mit Cookies
- Cookie-Löschfunktion
- Anzeige der Cookie-Lebensdauer
- Abfangen unbekannter Sprachen, Setzen einer Ausweichsprache
- Debuginformationen in einer Box
Funktionsweise
- Beim ersten Besuch der Zielseite startet die automatische Spracherkennung. Das System prüft den Browser auf mitgegebene Sprachinformationen im HTTP Header und nimmt die bevorzugte Sprache des Browsers als Seitensprache (falls Informationen mitgegeben und Sprache verfügbar).
- Der Benutzer kann manuell durch Anklicken von Länderfahnen/Links eine andere verfügbare Sprache wählen.
- Wird eine verfügbare Sprache vom Browser erkannt, vom Benutzer angeklickt oder anderweitig gewählt (z.B. manuelle URL Eingabe) so wird ein Cookie erstellt (falls möglich), in dem die Sprache gespeichert wird. Der Besucher wird bei seinem nächsten Webseitenbesuch also gleich die gewünschte Sprache sehen.
- Die Cookielaufzeit beträgt 1 Jahr. Bei jeder Aktion auf der Zielseite wird die Lebensdauer wieder auf 1 Jahr gesetzt. Der Tod des Cookies wird in der Debugbox ausgegeben. Durch einen Klick des Benutzers auf einen Button/Link lässt sich das Cookie löschen.
- Wird die Sprache (durch Browsererkennung, Wahl oder Eingabe) nicht erkannt oder ist für die erkannte Sprache kein übersetzter Inhalt vorhanden so wird eine Ausweichsprache (Standardsprache) gesetzt.
Den Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.
<?php
/*
######################
PHP Multilanguage
######################
Desc: This page detects your browserlanguage, cookie or chosen language with PHP and displays the right content.
Author: Hannes Schurig
Date: 15.06.2011
Edited: 16.06.2011 (v1.4)
Changelog:
1.1: komplett umgeschrieben... Funktion langanalyse geschrieben, gekürzt, optimiert
1.2: + Debugmeldung (echo Ausgabe) bei unbekannter Sprache, mehr Kommentare
1.3: + Cookie löschen Feature
1.4: + Cookie Lebensdaueranzeige, Lebensdaueroptimierung (exakt 1 Jahr), besseres Deutsch in der Debugbox
1.5: * Code minified
1.6: + header(Location) URL correction, no more .php?lang=?? after choosing lang (only in minified version, link below)
###################
minified version
###################
!URL minified productive version: http://hannes-schurig.de/21/06/2011/php-mehrsprachigkeitssystem-minified/
*/
$lang = detectlang();
// Spracherkennung
// GET abfragen; wird geliefert wenn ein Sprachlink geklickt wird
if(isset($_GET["lang"])) {
$lang = langanalyse($_GET["lang"],"get");
}
// POST abfragen; wird in meinem Beispiel nicht benutzt
elseif(isset($_POST["lang"])) {
$lang = langanalyse($_POST["lang"],"post");
}
// Cookie abfragen; ist ab dem 2. Besuch gesetzt (wenn Cookies aktiviert sind)
elseif(isset($_COOKIE["lang"])) {
$lang = langanalyse($_COOKIE["lang"],"cookie");
}
// keine Sprache gefunden; Browsersprache erkennen, die Sprache mit der höchsten Priorität auswählen
else {
$cutstring = explode("-", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
$detectlang = $cutstring[0];
$lang = langanalyse($detectlang,"browser");
}
// Überprüfe ob für die Sprache verfügbar ist
function langanalyse($new_lang, $methode) {
switch($new_lang) {
// die erlaubten Sprachen hier hintereinander auflisten
case ("de"):
case ("en"):
$lang = $new_lang;
setcookie("lang", $lang, time()+31536000);
break;
// Cookie löschen Funktion als Pseudo-Sprache
case ("delete"):
setcookie("lang", $lang, time()-3600);
break;
// für die erkannte Sprache sind keine Übersetzungen vorhanden oder die Sprache ist gänzlich unbekannt
default:
$unknown_lang = 1;
// die Standardsprache:
$lang = "en";
setcookie("lang", $lang, time()+31536000);
}
// Methode erkennen, Debugbox öffnen und Informationen ausgeben
switch($methode) {
case ("get"): echo('<div id="langdebug">Methode = get<br/>'); break;
case ("post"): echo('<div id="langdebug">Methode = post<br/>'); break;
case ("cookie"): echo('<div id="langdebug">Methode = cookie<br/>'); break;
case ("browser"): echo('<div id="langdebug">Methode = browserdetect<br/>
(kein GET, POST und COOKIE gefunden)<br/>
Browserlang: '.$_SERVER["HTTP_ACCEPT_LANGUAGE"].'<br/>'); break;
default: echo('<div id="langdebug">Methode = Unbekannt oder Fehler<br/>'); break;
}
// Hinweis im Debugbox wenn Sprache unbekannt
if($unknown_lang == 1) {
echo('!! Sprache "'.$new_lang.'" unbekannt. Auf "'.$lang.'" gesetzt<br/>');
$unknown_lang = 0;
}
return $lang;
}
// ein paar zusätzliche Debuginformationen und die manuelle Sprachwahl
echo('aktuelle Sprache = '.$lang.'<br/>
Cookie Sprache = '.$_COOKIE["lang"].'<br/>
Cookie Tod = '. date("d.m.Y G:i",time()+31536000) .'<br/>
Sprache setzen:<br/>
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=de">Deutsch</a>
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=en">Englisch</a><br/>
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=delete">Cookie löschen</a>
</div>');
// PHP Array mit den eigentlichen Inhalten der erlaubten Sprachen
$content["de"]["text"]="Hallo, dies ist nur ein Test";
$content["en"]["text"]="Hello, this is just a test";
$content["de"]["menu"]="
<ul>
<li>Autos</li>
<li>Frauen</li>
<li>Alkohol</li>
</ul>";
$content["en"]["menu"]="
<ul>
<li>Sex</li>
<li>Drugs</li>
<li>Rock'n'Roll</li>
</ul>";
$content["de"]["info"]="Zu Ihrer Information:<br/>
News 1: bla<br/>
News 2: bla<br/>
Test";
$content["en"]["info"]="For Your Information:<br/>
News 1: Foo<br/>
News 2: Bar<br/>
foobar";
?>
<html>
<head>
<title>Mehrsprachigkeit mit PHP, Array und COOKIES</title>
<style type="text/css">
div {
margin: 20px;
padding: 15px;
float: left; }
#langdebug {
border: 1px solid black;
font-size: 0.8em; }
</style>
</head>
<body>
<div id="menu">
<? echo($content[$lang]["menu"]); ?>
</div>
<div id="text">
<? echo($content[$lang]["text"]); ?>
</div>
<div id="info">
<? echo($content[$lang]["info"]); ?>
</div>
</body>
</html>
v1.1: komplett umgeschrieben… Funktion langanalyse geschrieben, gekürzt, optimiert
v1.2: + Debugmeldung (echo Ausgabe) bei unbekannter Sprache, mehr Kommentare
v1.3: + Cookie löschen Feature
v1.4: + Cookie Lebensdaueranzeige, Lebensdaueroptimierung (exakt 1 Jahr), besseres Deutsch in der Debugbox
*v1.5: minified/productive version available: Link
*v1.6: + header(Location) URL Korrektur nach Sprachwahl, keine lästigen .php?lang=?? Parameter mehr (nur in der Produktivversion verfügbar)

