Sprache im Browser-Header erkennen und weiterleiten
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alpha
anzeigen
array
aufruf
auto
code
datei
file
first
header
hit
http
index
most
ordner
rang
sprache
string
verzeichnis
weiterleitung
-
Hallo,
ich habe vor eine Webseite in 2 Sprachen zu erstellen. Dazu habe ich mir folgendes vorgestellt:
- im Hauptverzeichnis befindet sich 1 index.php und 2 Ordner mit je einem Content in jewiliger Sprache z.B. "en" und "de"
- in der index-Datei wird mit Hilfe des Browser-Headers die Sprache erkannt
- nach der Erkennung wird in das jeweilige Ordner weitergeleitet, also falls die Funktion einen englischen Browser erkennt, wird auf den Content im Ordner "en" weitergeleitet
Das möchte ich auf jeden Fall in PHP realisieren.
So, nun bin ich noch etwas neu in PHP und brauche eure Unterstützung ;)
So in der Art, nur dass man halt weitergeleitet wird ^^:
$requested_language = ""; if (!isset($_SESSION["language"])) { if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]) && $_SERVER["HTTP_ACCEPT_LANGUAGE"] != "") { $requested_language = preg_split("/[\W]+/",$_SERVER["HTTP_ACCEPT_LANGUAGE"], 2); $requested_language[0] = strtolower($requested_language[0]); } if (preg_match('/^[\w]{2,3}$/', $requested_language[0])) { wie leite ich jetzt weiter? ^^ } else { die Standardsprache } }
Beitrag zuletzt geändert: 29.2.2012 14:26:00 von mcdonalds-coupons -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Mach es doch wie folgt:
Leg eine Datei /php/language.php an. Diese bekommt via GET Parameter "language" und "file" die Sprache in der die Datei angezeigt werden soll.
# default die index.html anzeigen
RewriteRule ^de/$ /php/language.php?language=de&file=index.html [L,QSA]
RewriteRule ^en/$ /php/language.php?language=en&file=index.html [L,QSA]
# falls eine Datei angegeben wurde, diese Datei anzeigen
RewriteRule ^de/(.*)$ /php/language.php?language=de&file=$1 [L,QSA]
RewriteRule ^en/(.*)$ /php/language.php?language=en&file=$1 [L,QSA]
# CSS Verzeichnis auch in den Unterordnern verfügbar machen
RewriteRule ^de/css/(.*)$ /css/$1 [L,QSA]
RewriteRule ^en/css/(.*)$ /css/$1 [L,QSA]
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ /de/ [L,R=301]
RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^$ /en/ [L,R=301] -
/* determine which language out of an available set the user prefers most $available_languages array with language-tag-strings (must be lowercase) that are available $http_accept_language a HTTP_ACCEPT_LANGUAGE string (read from $_SERVER['HTTP_ACCEPT_LANGUAGE'] if left out) */ function prefered_language ($available_languages,$http_accept_language="auto") { // if $http_accept_language was left out, read it from the HTTP-Header if ($http_accept_language == "auto") $http_accept_language = $_SERVER['HTTP_ACCEPT_LANGUAGE']; foreach ($available_languages AS $langkey) { $failover[substr($langkey,0,2)] = $langkey; $new_available_languages[] = $langkey; $new_available_languages[] = substr($langkey,0,2); } // standard for HTTP_ACCEPT_LANGUAGE is defined under // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 // pattern to find is therefore something like this: // 1#( language-range [ ";" "q" "=" qvalue ] ) // where: // language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" ) // qvalue = ( "0" [ "." 0*3DIGIT ] ) // | ( "1" [ "." 0*3("0") ] ) preg_match_all("/([[:alpha:]]{1,8})(-([[:alpha:]|-]{1,8}))?" . "(\s*;\s*q\s*=\s*(1\.0{0,3}|0\.\d{0,3}))?\s*(,|$)/i", $http_accept_language, $hits, PREG_SET_ORDER); // default language (in case of no hits) is the first in the array $bestlang = $new_available_languages[0]; $bestqval = 0; foreach ($hits as $arr) { // read data from the array of this hit $langprefix = strtolower ($arr[1]); if (!empty($arr[3])) { $langrange = strtolower ($arr[3]); $language = $langprefix . "_" . strtoupper($langrange); } else $language = $langprefix; $qvalue = 1.0; if (!empty($arr[5])) $qvalue = floatval($arr[5]); // find q-maximal language if (in_array($language,$new_available_languages) && ($qvalue > $bestqval)) { $bestlang = $language; $bestqval = $qvalue; } // if no direct hit, try the prefix only but decrease q-value by 10% (as http_negotiate_language does) else if (in_array($langprefix,$new_available_languages) && (($qvalue*0.9) > $bestqval)) { $bestlang = $langprefix; $bestqval = $qvalue*0.9; } } return array_key_exists($bestlang,$failover) ? $failover[$bestlang] : $bestlang ; }
Aufruf wie folgt:
$simplecms->getLocaleEnabled(); // = array('de_DE','en_US'); echo prefered_language($simpelcms->getLocaleEnabled());// return Default first Array Entry if not match something...
nun die Index.php für die Weiterleitung:
header('location: '.prefered_language( $simpelcms->getLocaleEnabled() ) );
So habe ich das in einem Projekt von mir drin... bei mir ist aber das Verzeichnis auch in Form von "de_DE" usw. gestrickt.
Kann man also gut anpassen ;) in dem man paar sachen auskommentiert... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage