Zur Navigation

Weiterleitung abhängig von Sprache

1 Tilman

Hallo!

Ich will eine Seite erstellen, die man auf mehreren Sprachen betrachten kann.

Beispiel:

www.beispiel.com
Englische Version: www.beispiel.com/en/index.html
Deutsche Version: www.beispiel.com/de/index.html
Französiche Version: www.beispiel.com/fr/index.html

Praktisch wäre es, wenn die Webseite erkennen würde, welche Sprache auf dem Computer gewählt wäre, und dann die passende Seite geladen wird.

Gibt es so einen Code?

11.12.2007 16:41

2 Jörg Kruse

Hallo Tilman,

die Variable $_SERVER['HTTP_ACCEPT_LANGUAGE'] gibt die bevorzugte Sprache des Clients an. Du könntest in PHP dierse Variabel auswerten und entsprechend weiteleiten. Z.B. folgendermaßen auf der Hauptseite (www.beispiel.com):

<?php
    
switch ($_SERVER['HTTP_ACCEPT_LANGUAGE']) {
case 'de':
    $location = 'http://www.beispiel.com/de/';
    break;
case 'fr':
    $location = 'http://www.beispiel.com/fr/';
    break;
default:
    $location = 'http://www.beispiel.com/en/';
}

header('HTTP/1.1 301 Moved Permanently'); 
header('location: ' . $location); 
header('Connection: close');

?>

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. Im Internetcafe im Ausland kann man so z.B. nicht die deutschsprachige Version wählen

11.12.2007 18:15

3 Rudy

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?

11.12.2007 18:56 | geändert: 11.12.2007 18:58

4 Jörg Kruse

Da griff mein Ansatz etwas zu kurz - danke für die Ergängzung :)

Zitat von Rudy
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?

Ja, so könnten Besucher und Suchmaschinenbots alle Versionen aufrufen

11.12.2007 19:46 | geändert: 11.12.2007 19:47

5 Tilman

Und wie lautet der Code zusammen?

15.12.2007 08:56

6 Rudy

//SUPPORTED LANGUAGES
$languages = array('en'=>'English', 'de'=>'Deutsch', 'fr'=>'Française');
//N.B. Die erste Sprache des Arrays ist die Default-Sprache, wenn die Usersprache nicht erkannt wird - die Keys des Arrays müssen die ISO 639-1 Codes der Sprache sein

 // 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();  
header('HTTP/1.1 301 Moved Permanently');
header('location: http://www.beispiel.com/' . $userlanguage . '/');
header('Connection: close');

?>

15.12.2007 13:16 | geändert: 15.12.2007 13:19

7 Tilman

Wo gebe ich die Adressen ein, die bei den jeweiligen Sprachen aufgerufen werden sollen?

Wo muss ich den Code einfügen?

15.12.2007 16:43

8 Rudy

Der Code in p6 leitet an http://www.beispiel.com/en/, http://www.beispiel.com/de/ oder http://www.beispiel.com/fr/ weiter. , im Befehl
header('location: http://www.beispiel.com/' . $userlanguage . '/');
Ändere dort die Domain entsprechend ab und setze den Code in index.php, die sich im Root-Verzeichnis der Domain befindet (also in http://www.beispiel.com/index.php).

15.12.2007 17:32 | geändert: 15.12.2007 17:34

... 5 Jahre und 2 Monate später ...

9 Gast 289034657 (Gast)

Dankeschön :-)

26.02.2013 10:38

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]