Hallo Linker,
Das soll auch nicht 'sehr verlockend' sein ;-) ist aber gültig.
(Schau mal nach http://toter-link.de )
PS: Das Bild auf toter-link.de hat meine Frau dort platziert.
Ok. ;-)
Da wir gerade dabei wären: ich hab' mich jetzt mal an die Arbeit gemacht und bin mit dem Ergebnis recht zufrieden:
------------------------------------------------------------------------------------------
// detect browser language
function lang_getfrombrowser ($allowed_languages, $default_language) {
// did the browser send any information
if (empty($_SERVER["HTTP_ACCEPT_LANGUAGE"])) {
// no? => return default language
return $default_language;
}
// split the array
$accepted_languages = preg_split("/,\s*/", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
// init the values to default values
$current_lang = $default_language;
$current_q = 0;
// no go through all the languages specified
foreach ($accepted_languages as $accepted_language) {
// tryp to get all information about it
$res = preg_match ("/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:.[0-9]{1,3})?|1(?:.0{1,3})))?$/", $accepted_language, $matches);
// did it match
if (!$res) {
// no? then ignore it
continue;
}
// now get the language code and separate it
$lang_code = explode ('-', $matches[1]);
// was a quality supplied?
if (isset($matches[2])) {
// use this one
$lang_quality = (float)$matches[2];
} else {
// compability mode: assume quality of 1
$lang_quality = 1.0;
}
// until the array is empty
while (count ($lang_code)) {
// see if language code matches
if (in_array (join ('-', $lang_code), $allowed_languages)) {
// look at the quality
if ($lang_quality > $current_q) {
// use that language
$current_lang = join ('-', $lang_code);
$current_q = $lang_quality;
// break up the while loop
break;
}
}
// if the constant CONTENT_NEGOTIATE_STRICT is set, don't test minimalized versions of this language
if (defined ('CONTENT_NEGOTIATE_STRICT')) {
// break up the while loop
break;
}
// pop the array
array_pop ($lang_code);
}
}
// return the language found
return $current_lang;
}
------------------------------------------------------------------------------------------
Zur Erklärung: Der Header wird zuerst aufgeteilt am Kommazeichen. Danach wird jedes einzelne Strück analysiert. Dabei wird der Sprachcode nach den Bindestrichen getrennt in ein Array geschrieben. Dieses Array wird wieder zusammengefügt und es wird getestet, ob die Sprache a) passt und b) die Qualität höher als eine vorige ist. Wenn das der Fall ist, wird die Sprache genommen. Wenn das _nicht_ der Fall ist, dann wird mit array_pop der letzte Teil des Arrays entfernt und dann wird nochmal geprüft, solange bis der Array zuende ist. Man kann dieses Verhalten, das nicht 100% RFC-konform ist, aber manchmal wünschenswert, durch die Konstante CONTENT_NEGOTIATE_STRICT abstellen, d.h. wenn diese definiert ist, testet er nur den Sprachcode selber und nicht minimalisierte Varianten davon.
Anregungen? Weitere Kritik?
Sollte aber auch aus deinen Projekten verband werden, wenn es _gar nicht_ anders geht nimm lieber $GLOBALS['config']. (meine Meinung)
Du hast ja recht, aber wie sagt man so schön? Ich war jung und brauchte die Zeit. ;-)
Grüße,
Christian
Ich bitte darum, dass ein Themenbereich (BARRIEREFREIHEIT) eingerichtet wird.