# Automatische Spracherkennung vom Browser



## Fix&Foxi (10. November 2009)

Hallo Leute,

habe einen passenden Link gefunden zur auto. Sprachauswahl, leider ohne lähere erklährung 

Blos mal wieder das Problem das ich nur bahnhof von php versehe 

ich möchte die sache ohne die cookis gerne bewegstelligen

Soll ich denn code in denn header der index.html schreiben?

oder muss ich ein neues (html?) anlegen und da denn php code schreiben und die sache dann als index.html(php?) speichern?


```
<?php
 $sprache = getenv('HTTP_ACCEPT_LANGUAGE');

 if(ereg("es",$sprache)) { header("Location: index_e.html");
}

if(ereg("en",$sprache)) { header("Location: index_gb.html");
}
 if(ereg("de",$sprache)) { header("Location: index_d.html");
}
 ?>
```


Hier der Link von meiner Seite

muss ich da MySQL technisch noch was machen?


----------



## Da_Chris (10. November 2009)

wenn dann php code (oder php und html gemischt) immer als php file speichern.
Hier reicht es wenn du den code als index.php speicherst.


----------



## Fix&Foxi (10. November 2009)

habe jetzt probiert und es klappt nicht

die alte index.html umbenannt in index_es.html

neues dokument php gespeichert als index.php und denn code reingeschrieben:


```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<!-- TemplateBeginEditable name="doctitle" -->
<title>Unbenanntes Dokument</title>
<!-- TemplateEndEditable -->
<!-- TemplateBeginEditable name="head" -->
<!-- TemplateEndEditable -->
</head>

<body>
<?php 
 $sprache = getenv('HTTP_ACCEPT_LANGUAGE'); 

 if(ereg("es",$sprache)) { header("Location: index_es.html"); 
} 

if(ereg("en",$sprache)) { header("Location: index_gb.html"); 
} 
 if(ereg("de",$sprache)) { header("Location: index_d.html"); 
} 
 ?>
</body>
</html>
```


habe auch mal probiert denn code in denn header zuschreiben ....klappt auch nicht.


Bitte schreib mir einer mal....was soll ich genau machen


----------



## CookieBuster (10. November 2009)

Schreib mal nach 


```
$sprache = ...
```

ein


```
var_dump($sprache);
```

und schreib uns die Ausgabe.


----------



## Da_Chris (10. November 2009)

natürlich geht es nicht ich hab auch nicht gesagt das du da noch was dazu tun sollst  

Du hast hier erst eine Ausgabe und willst dann einen header setzen. 
Das geht nicht das gibt nen Error. 
Der Code oben ohne alles in deine PHP ist die Lösung!

Aber ein Tip mach es besser so:

```
<?php 
$sprache = @getenv('HTTP_ACCEPT_LANGUAGE'); 

if(ereg("es",$sprache)) { 
      header("Location: index_es.html"); 
}  
else if(ereg("en",$sprache)) { 
      header("Location: index_gb.html"); 
} 
else if(ereg("de",$sprache)) { 
      header("Location: index_d.html"); 
} 
else{ 
      header("Location: index_default.html"); 
} 
 ?>
```

Das leitet zu der default seite falls der browser des users den wert unterdrückt.
(kannst auch de oder en dafür verwenden.)


----------



## Fix&Foxi (10. November 2009)

wunderbar das klappt prima......jetzt muss ich nur noch wissen wie man Safari auf eine andere sprachwahl umstellt, damit ich das mal in - es, e- testen kann.


----------



## Parantatatam (10. November 2009)

Im Safari 4 kann man in den Einstellungen die Option _*Menü "Entwickler" in der Menüleiste anzeigen*_ auswählen, welche du in dem Tab _*Erweitert*_ findest. Dann hast du diesen Menüpunkt und kannst unter _*Benutzer-Agent > Anderer ...*_ deine gewünschte Sprache eingeben.


----------



## Gumbo (10. November 2009)

Deine einfache Falls-enthalten-Prüfung reicht leider nicht aus. Denn _Accept-Language_ ist eine bewertete Liste von Sprachen und das alleinige Vorkommen einer Sprache sagt nichts über ihre Bewertung aus. So kann etwa eine andere Sprache eine höhere Bewertung haben oder sogar explizit ausgeschlossen werden.
Du solltest besser die Liste der Werte parsen und die besten Übereinstimmung auswählen.


----------



## Fix&Foxi (11. November 2009)

einfach nur crack hat gesagt.:


> _*Benutzer-Agent > Anderer ...*_ deine gewünschte Sprache eingeben.


 

Klappt leider nicht, er geht immer wieder auf die index_d.html (deutsch)


Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; en-en) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9

auch spanisch klappt nicht:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_4_11; es-es) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9



Gumbo hat gesagt.:


> Du solltest besser die Liste der Werte parsen und die besten Übereinstimmung auswählen.


 

Sorry, ich versehe nur bahnhof.....heißt das jetzt, meine umsetztung t so wieso nicht?
Kannst du mir da schreiben was ich machen soll!

Habe gerade die Info von einen Kumpel bekommen, dass es nicht sauber auf alles Browsern t:

"Scheint aber nur im IE zu funktionieren. Beim Firefox bekomme ich die englische Sprachversion geliefert"

Habt ihr da neh idee woran das liegen könnte?

Wie schon gesagt, im Safari kommt immer die deutsche version


----------



## KD3 (11. November 2009)

```
function GetLangByAL(){return substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);}
```

Die komplett Lösung möchte ich nicht posten


----------



## Fix&Foxi (11. November 2009)

KD3 hat gesagt.:


> Die komplett Lösung möchte ich nicht posten



 Da ich von php leider keinen plan habe, komme ich damit auch nicht weiter. 

Aber trotzdem danke evt. kann damit jemand was anfangen und mir die* kompette Lösung mal verraten
*


----------



## Gumbo (11. November 2009)

_Accept-Language_ enthält eine Liste bewerteter Werte. Die Wertung erfolgt über den optionalen _q_-Parameter, der Werte zwischen 1 und 0 einschließlich erlaubt. 1 heißt absolute bevorzugt, 0 heißt nicht akzeptabel; fehlt der Wert, wird 1 angenommen. Die Reihenfolge der Werte spielt hingegen erst einmal keine Rolle.
Diese Liste von Werten solltest du nun parsen und der Bewertung nach ordnen und kannst so den Wert mit der größten Übereinstimmung zwischen den akzeptierten und deinen verfügbaren Werten ausfindig machen. Nun erst kannst du die Reihenfolge der Werte in Betracht ziehen, um etwa den ersten zweier oder mehrerer gleichbewerteter Werte zu wählen.

Siehe dazu auch den Wikipedia-Artikel zu _Content Negotiation_.


----------



## KD3 (12. November 2009)

```
preg_match_all('~[a-z]{2,}\;q=([0-1]{1}\.{0,}[0-9])~', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);

for($i=0;$i<count($matches[1])-1;++$i){if($matches[1][$i]>=0.5){ echo substr($matches[0][$i],0,2); break;}}
```


Ansonsten wäre vll auch die Funktion get_browser() für dich interessant denke ich mal


----------



## Gumbo (12. November 2009)

Du solltest auch auf andere Varianten achten. Die Sprach-Tags können auch spezifischer sein (etwa _de-ch_ für Schweizerdeutsch), kein Qualitätsparameter haben und auch Leerzeichen zwischen den einzelnen Teilen enthalten.


----------



## KD3 (12. November 2009)

Naja falls wer seinen Header "manipuliert" dann wäre das so, aber sonst eher nicht oder?^^


----------



## Gumbo (12. November 2009)

Das hat doch gar nichts mit Manipulation zu tun. Allein dass es erlaubt ist, sollte Grund genug dafür sein, um diese Lösung als nicht ausreichend abzulehnen.


----------



## Da_Chris (13. November 2009)

Falls wer den Header manipuliert hast du pech gehabt.
Das ganze system ist nicht sicher da die variablen nunmal manipuliert sein können.
Traue nie einer Uservariablen


----------



## teutu (10. Dezember 2009)

Hallo zusammen,

habe diesen Beitrag von Anfang an aufmerksam gelesen und versucht 1:1 umzusetzen. Leider ohne Erfolg. Daher meine Frage ob jemand sich die Mühe machen könnte meine step-by-step Anleitung Korrektur zu lesen?

*Ich wiederhole kurz mein Vorgehen:*

1. Den nachfolgenden PHP Code kopiere ich in den Windows Editor und speicher die Datei unter dem Namen index.php ab

2. Diese Datei lade ich dann per FTP Programm in das Stammverzeichnis (root Verzeichnis) auf meinem Webspeicher

3. Nun benenne ich die einzelnen index Seiten in index_de.html + index_en.html + index_es.html

 Zum Testen stelle ich meinen Firefox auf die bevorzugte Sprache englisch ein (Extras --> Einstellungen --> Inhalt --> Sprachen).

Und nun?

Wer sich die Sache mal live anschauen möchte: www.notebookdesign.com

Hier der verwendete Code


```
<?php 
$sprache = @getenv('HTTP_ACCEPT_LANGUAGE'); 

if(ereg("es",$sprache)) { 
      header("Location: index_es.html"); 
}  
else if(ereg("en",$sprache)) { 
      header("Location: index_en.html"); 
} 
else if(ereg("de",$sprache)) { 
      header("Location: index_de.html"); 
} 
else{ 
      header("Location: index_en.html"); 
} 
 ?>
```


----------

