Seite 1 von 1
problem mit sprachweiche
Verfasst: 11.07.2011, 21:16
von mano_negra
ich hab ein problem mit einer sprachweiche und komm da nicht weiter und steh jetzt ziemlich dumm da.
hatte die jahrelang im einsatz und nie ist mir was aufgefallen.
jetzt merkte ich plötzlich im firefox dass nicht mehr auf die andere sprache umgeschalten wurde. aha, denk ich was is das für scheiss, probier den IE und es funktioniert. nochmal FF, cache leeren und funktioniert. aber jetzt funktioniert der IE plötzlich nicht mehr. chrome ausprobiert, funktioniert ein paar mal, dann plötzlich nicht mehr. egal was für browser - manchmal funktionierts, dann plötzlich nicht mehr. dann hilft nur mehr cache leeren oder browser neu starten.
das ist mir ein rätsel und ich weiss nicht wo der fehler liegen könnt oder wo ich zum suchen anfangen soll.
im prinzip funktionierts so (oder sollte so funktionieren):
mit einem link ala ?lang=de wird ein cookie für die sprache gesetzt, ausserdem wird die bevorzugte browsersprache ausgelesen und dann eben auf die passende seite weitergeleitet.
?
Verfasst: 11.07.2011, 22:47
von mano_negra
das is echt zum verrückt werden, manchmal kann man ohne probleme 1000mal wechseln und manchmal ist nach 3mal schluss.
hier meine index.php:
Code: Alles auswählen
<?php
$la = $_GET['la'];
if ($la!=null){setcookie("sprache", $la,time()+60*60*24*30 ,"/");}
if ($la=="de"){header("HTTP/1.1 301 Moved Permanently");header("Location: http://www.meinedomain.com/");exit;}
if ($la==null){
if($_COOKIE[sprache] == "de") { $la="de"; }
if($_COOKIE[sprache] == "en") { $la="en"; }
}
include_once ('sprache.php');
$allowed_langs = array ('de', 'en');
$lang = lang_getfrombrowser ($allowed_langs, 'de', $la, false);
if ($lang=="de"){include ('de.php');}
if ($lang=="en"){header("HTTP/1.1 301 Moved Permanently");header("Location: http://www.meinedomain.com/en/");exit;}
?>
de.php ist dabei der deutsche inhalt und die engl. version liegt auf /en/
sprache.php ist ein script das ich so aus dem internet kopiert hab:
Code: Alles auswählen
<?php
// Browsersprache ermitteln
function lang_getfrombrowser ($allowed_languages, $default_language, $lang_variable = null, $strict_mode = true) {
// $_SERVER['HTTP_ACCEPT_LANGUAGE'] verwenden, wenn keine Sprachvariable mitgegeben wurde
if ($lang_variable === null) {
$lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
}
// wurde irgendwelche Information mitgeschickt?
if (empty($lang_variable)) {
// Nein? => Standardsprache zurückgeben
return $default_language;
}
// Den Header auftrennen
$accepted_languages = preg_split('/,\s*/', $lang_variable);
// Die Standardwerte einstellen
$current_lang = $default_language;
$current_q = 0;
// Nun alle mitgegebenen Sprachen abarbeiten
foreach ($accepted_languages as $accepted_language) {
// Alle Infos über diese Sprache rausholen
$res = preg_match ('/^([a-z]{1,8}(?:-[a-z]{1,8})*)'.
'(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $accepted_language, $matches);
// war die Syntax gültig?
if (!$res) {
// Nein? Dann ignorieren
continue;
}
// Sprachcode holen und dann sofort in die Einzelteile trennen
$lang_code = explode ('-', $matches[1]);
// Wurde eine Qualität mitgegeben?
if (isset($matches[2])) {
// die Qualität benutzen
$lang_quality = (float)$matches[2];
} else {
// Kompabilitätsmodus: Qualität 1 annehmen
$lang_quality = 1.0;
}
// Bis der Sprachcode leer ist...
while (count ($lang_code)) {
// mal sehen, ob der Sprachcode angeboten wird
if (in_array (strtolower (join ('-', $lang_code)), $allowed_languages)) {
// Qualität anschauen
if ($lang_quality > $current_q) {
// diese Sprache verwenden
$current_lang = strtolower (join ('-', $lang_code));
$current_q = $lang_quality;
// Hier die innere while-Schleife verlassen
break;
}
}
// Wenn wir im strengen Modus sind, die Sprache nicht versuchen zu minimalisieren
if ($strict_mode) {
// innere While-Schleife aufbrechen
break;
}
// den rechtesten Teil des Sprachcodes abschneiden
array_pop ($lang_code);
}
}
// die gefundene Sprache zurückgeben
return $current_lang;
}
?>
Verfasst: 12.07.2011, 02:24
von 3rr0r
Hallo ...
also das kann man sicher einfacher machen ...
LG .... Martin
Code: Alles auswählen
if (defined('SPRACHE')) {$sprachweiche='FEHLER - KONSTANTE BEREITS DEFINIERT';}
if (!defined('SPRACHE')) {
if (isset($_GET['language'])) {define('SPRACHE',$_GET['language']); setcookie("language", $la,time()+60*60*24*30 ,"/");
$sprachweiche='parameter';}
} // Sprache als Parameter
if (!defined('SPRACHE')) {
if (isset($_COOKIE['language'])) {define('SPRACHE',$_COOKIE['language']); $sprachweiche='cookie';}
} // Sprache aus Cookie
if (!defined('SPRACHE')) {
$sprachweiche='browser';
$temp=strtolower('__'.$_SERVER['HTTP_ACCEPT_LANGUAGE'].'__');
if (strpos($temp,'de') > 0) {define('SPRACHE','DE');}
elseif (strpos($temp,'sp') > 0) {define('SPRACHE','SP');}
elseif (strpos($temp,'th') > 0) {define('SPRACHE','TH');}
else {define('SPRACHE','EN');}
} // Sprache aus Browser
echo '<br>SPRACHE:_'.SPRACHE;
echo '<br>WESHALB:_'.$sprachweiche;
echo '<br>301SENDEN:_';
if ($sprachweiche=='parameter') {echo 'Y';} else {echo 'N';}
Verfasst: 12.07.2011, 13:21
von mano_negra
danke, das schau ich mir auch noch an.
mittlerweile hab ich den fehler gefunden. es dürfte nur die letzte zeile sein, wo die startseite auf die engl. seite per 301 weitergeleitet wird. genau dieser 301er ist das problem, weil der browser sich das merkt und dann nicht mehr auf die deutsche seite leitet.
und der fehler ist auch nur aufgetreten, wenn ich zwischen dem umschalten auf die startseite geklickt habe.
ein 302 ist hier das einzig richtige und dann funktionierts auch.