PHP Mehrsprachigkeitssystem mit Debugging

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.
Code

Code anzeigenDen 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>
Demo

Demo Link

Download

latest [.zip]

alte Versionen

Changelog


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)

3 Kommentare

  1. Hallo ich hab durch Zufall diesen Artikel gefunden und bin begeistert endlich mal einer der einem ein Beispiel gibt. Ich muss dazu sagen das ich seit einiger Zeit auf der Suche nach Informationen bin wie ich eine bestehende Seite Mehrsprachig gestalten kann. Ich denke das Ihr Artikel da sehr hilfreich ist.
    Mfg
    uwest

  2. hi… tolles script..!

    kannst du bitte dringend noch dieses script vorstellen mit unterseiten die includiert werden sollen…

    zb. diese index includiert je nach sprache eine das entsprechende menu (en oder de) danach zb. auf englischen link zb. offers.php (in unterordner) oder im deutschen menu (angebote.php) usw..

    wäre echt toll.. bin am verzweifeln!
    Tino

  3. Hallo Tino,

    grundsätzlich würde ich mittlerweile davon abraten, Mehrsprachigkeit mit diesem unprofessionellen Code umzusetzen – vermutlich gibt es wesentlich bessere und einfachere Systeme. Ein einfaches CMS, das mehrere Sprachen unterstützt, wäre ebenfalls denkbar.
    Vor allem wenn die Programmierkenntnisse nicht für die Weiterentwicklung eines solchen PHP Systems ausreichen (für eine komplette Webseite müsste das sicher noch ausgebaut und verbessert werden), sollte eine fertige Lösung verwendet werden.

    Nichtsdestotrotz müsstest du den obigen Code auch für includes relativ unverändert nutzen können. Statt den mehrsprachigen Textinhalten musst du halt nur die gewünschten Dateien angeben und statt einem echo im Seiteninhalt nutzt du eben include:

    ...
    $content["de"]["service"]="dienstleistung.php";
    $content["en"]["service"]="service.php";
     
    ?>
    <html>
     <body>
      
      <? include($content[$lang]["service"]); ?>
    ...
    

    Nicht getestet, müsste aber eigentlich so oder so ähnlich gehen.

Schreibe einen Kommentar