So, ich bin jetzt in das PHP von Stackoverflow eingestiegen und habe heraus gefunden, warum das automatische Umschalten nicht funktioniert:
Lautet das Kürzel z. B. en-gb, so werden beide Hälften getrennt ausgewertet. Das "gb" rechts vom Bindestrich bekommt eine höhere Priorität und wird deshalb als bevorzugte Sprache ausgewählt. Im HTML und CSS ist jedoch nur "en" vorhanden, so dass die Umschaltung nicht funktioniert.
Ich habe den Code so geändert, dass es funktionieren sollte. Die Funktion ist jetzt kürzer und das Array länger. Ich hoffe, aus meinen Kommentaren wird klar, wie es konfiguriert werden muss.
Bei der manuellen Umschaltung habe ich mich für die CSS-Lösung entschieden. Typisch dafür ist, dass es gewisse Einschränkungen gibt: Die Radiobuttons müssen ganz am Anfang des Body stehen und wenn man die Labels entspr. Zustand hervorheben will, muss man sie entspr. adressieren.
Allzu intensiv habe ich es nicht getestet. Wenn Du Fehler findest, melde dich wieder.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<title>Test Sprachumschaltung</title>
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<?php
function get_prefered_language(array $available_languages, $http_accept_language) {
$langs;
preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);
foreach($matches as $match) {
list($a, $b) = explode('-', $match[1]) + array('', '');
$value = isset($match[2]) ? (float) $match[2] : 1.0;
if(isset($available_languages[$match[1]])) {
$langs[$match[1]] = $value;
continue;
}
}
arsort($langs);
return $langs;
}
// Die folgende Zeile aktivieren zum Test fuer Englisch
// $_SERVER["HTTP_ACCEPT_LANGUAGE"] = 'en-us,en;q=0.8,es-cl;q=0.5,zh-cn;q=0.3';
// Languages we support
// Key: language from browser
// Value: language used in HTML/CSS class
$available_languages = array(
"de" => "de", "de-de" => "de", "de-at" => "de", "de-ch" => "de",
"en" => "en", "en-us" => "en", "en-gb" => "en", "en-ca" => "en"
);
$displayed_languages = array_unique($available_languages);
$langs = get_prefered_language($available_languages, $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
if (count($langs) > 0) {
reset($langs);
$thelang = $available_languages[key($langs)];
} else $thelang = "de";
?>
<style>
input[value='de']:checked ~ *:not([class*='lang-de'])[class*='lang-'] {display: none;}
input[value='de']:checked ~ * *:not([class*='lang-de'])[class*='lang-'] {display: none;}
input[value='en']:checked ~ *:not([class*='lang-en'])[class*='lang-'] {display: none;}
input[value='en']:checked ~ * *:not([class*='lang-en'])[class*='lang-'] {display: none;}
input { display: none; border: 2px solid transparent;}
input[id='rdlang-de']:checked ~ label[for='rdlang-de'] {border: 2px solid grey;}
input[id='rdlang-en']:checked ~ label[for='rdlang-en'] {border: 2px solid grey;}
</style>
</head>
<body>
<!-- Die Inputs, die im folgenden generiert werden, muessen ganz am Anfang des Body stehen.
Die Labels können an beliebiger Stelle stehen. -->
<?php
foreach($displayed_languages as $acc_lang => $disp_lang) {
if ($disp_lang == $thelang) $rq = ' checked'; else $rq = '';
echo '<input type="radio" id="rdlang-' . $disp_lang . '" name ="rdlang" value="' . $disp_lang . '"' . $rq . '>';
}
?>
<label for="rdlang-de">Deutsch</label>
<label for="rdlang-en">English</label>
<p class="lang-de">Dies ist deutscher Text</p>
<p class="lang-de">Dies ist noch ein deutscher Text</p>
<div>
<p class="lang-de">Dies ist eingebetteter deutscher text</p>
</div>
<p class="lang-en">This is english text</p>
<p class="lang-en">This is another english text</p>
<div>
<p class="lang-en">This is nested english text</p>
</div>
<img src="images/sun.jpg">
</body>
</html>
Alles anzeigen