Wenn ein einfacher Switch nur reichen würde. Leider steht nicht in allen Headers immer nur "de" etc. drin, Fx z.B. liefert das q mit, etc.
Eine Funktion, die ich mal geschrieben (und sogar kommentiert :)) habe, macht das wieder gut - vielleicht gibts ne schönere Lösung, aber diese hier funktioniert.
//SUPPORTED LANGUAGES
$languages = array('de'=>'Deutsch', 'it'=>'Italiano', 'en'=>'English');
// Try to detect user-language and retrieve the best match
function detectLanguage() {
//For a list, see http://www.loc.gov/standards/iso639-2/langcodes.html
//note HTTP_ACCEPT_LANGUAGE (example German)
// - ie shows up 'de'
// - mozilla shows sth. like 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3' (q is the relevance)
// - opera shows 'de, en'
global $languages;
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$search = array('/q=[0-9\.]{3},?/', '/([a-z]{1,3})-([a-z]{1,3})(,|;)?/', '/\;$/', '/;/', '/,\s+/'); //remove q=xx and the iso 639-2 specific languages - only mozilla
$replace = array('', '', '', ', ', ', ');
$map = preg_replace($search, $replace, strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); //make Mozilla-Info Opera-like
$userlanguages = explode(',', $map); //explode the list of accepted iso639-1 languages
for($i=0; $i<count($userlanguages); $i++) $userlanguages[$i] = trim($userlanguages[$i]);
// after Operation = MOZILLA: array('de', 'en'); OPERA: array('de', 'en'); IE: array('de');
// Try to detect Primary language if several languages are accepted.
foreach ($userlanguages as $userlanguage) {
if (in_array($userlanguage, array_keys($languages))) {
return $userlanguage;
}
}
}
return reset(array_keys($languages));
}
$userlanguage = detectLanguage();
Die Nachteile bei diesem Verfahren sind, dass Suchmaschinen nur die Default-Language-Version indizieren und dass Besucher nicht selbsttätig eine andere Sprache auswählen können.
Ein Link auf die anderen Sprachen innerhalb der Seite macht dies wieder gut, oder?