Browsersprache erkennen und entsprechend weiterverlinken

  • HTML

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Link.

    Browsersprache erkennen und entsprechend weiterverlinken

    Hallo.
    Vorab: Ich weiß dass dieses Forum nicht auf Webentwickelung spezialisiert ist. Auch ist mir bewusst, dass es diverse solcher HTML-, PHP- etc. Foren gibt. Doch im Gegensatz zu diesen besitze ich für das VB-Paradise-Forum ein Profil, und da es ein entsprechendes Unterforum gibt, frage ich nun hier nach.

    Im Web gibt es zahlreiche Codes, die (rein theoretisch) mein Problem lösen könnten. Laut der jeweiligen Kommentaren dürften diese auch meist problemlos funktionieren.
    Aber genau hier liegt der Hund begraben: Alle Codes, die ich bereits gefunden habe (etwa 50(!) Stück), scheinen weder auf einem meiner Geräte, noch auf einem eines Bekannten wirklich zu funktionieren. Ich bin mir in den meisten Fällen zu fast 100% sicher, die Codes richtig angewendet zu haben, doch trotzdem: Bei den meisten Codes wird zwar eine Browser-Sprache decodiert, aber ... Es ist kompliziert.

    Erklärung
    1. Der Code ermittelt die Sprache.
    2. Eine If-Schleife:

    Quellcode

    1. Wenn Sprache = Deutsch
    2. → dann leite weiter zu example.de/Deutsche-Version.html
    3. Sonst Wenn Sprache = Englisch
    4. → dann leite weiter zu example.de/English-Version.html
    5. Sonst
    6. → dann leite weiter zu example.de/English-Version.html

    3. (Und hier liegt der Fehler) Obwohl die Sprache ganz sicher auf Deutsch eingestellt ist, tritt immer der "Else"-Fall ein.


    So: Jetzt suche ich nach einem hoffentlich funktionierenden Code, der das Problem löst. Ich hoffe, Ihr könnt mir weiterhelfen...

    PS: Ich habe keine PHP- oder JS-Kenntnisse :whistling:
    There are only 10 types of poeple in the world: Those who understand binary and those who don't.
    Zeig uns doch mal den bisherigen Code und die Sprache (bzw. den Sprachcode de-DE etc.), welche dein Browser an den Server übermittelt. Und ich glaube kaum, das keiner der "50" Codes nicht funktioniert hat.
    Grüße,
    Lukas

    Fragen über Themen im Forum per Konversation werden gelöscht und die Absender blockiert...
    Den Code kann ich dir im Moment nicht geben, da ich momentan nicht auf den Server zugreifen kann, doch wenn du das hier mit Sprachcode meintest: "de" wird zurückgegeben, und der Code soll dann auch weiterleiten. Tut er aber nicht. Ich habe es auch bereits mit de-DE ausprobiert.
    PHP-Code

    PHP-Quellcode

    1. <html>
    2. <head>
    3. <title>Sprache</title>
    4. </head>
    5. <body>
    6. <?php
    7. function getBrowserLangs() {
    8. $langs[0] = $langs[1] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    9. $langs[0] = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    10. foreach($langs[0] as $l) {
    11. $q = explode(';', $l);
    12. $lang = substr($q[0], 0, 2);
    13. $q = (isset($q[1])) ? (float)substr($q[1], 2) : 1;
    14. $result[$lang] = $q;
    15. }
    16. if(isset($result) && is_array($result)) {
    17. arsort($result, SORT_NUMERIC);
    18. return $result;
    19. }
    20. return $result[$langs[1]] = 1;
    21. }
    22. $langs = getBrowserLangs();
    23. foreach($langs as $prio => $lang) {
    24. if($lang === 'de') {
    25. echo "Deutsch";
    26. break;
    27. } elseif($lang === 'en') {
    28. echo "Englisch";
    29. break;
    30. } else{
    31. echo "Weder noch";
    32. }}
    33. ?>
    34. </body>
    35. </html>

    There are only 10 types of poeple in the world: Those who understand binary and those who don't.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sky Super“ ()

    Warum umständlich machen, wenn es auch einfach geht:

    PHP-Quellcode

    1. $sprache = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
    2. if(strpos($sprache,"de") == false)
    3. {
    4. echo "Englisch";
    5. }
    6. else
    7. {
    8. echo "Deutsch";
    9. }


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bore“ ()

    Bore schrieb:

    Was die meisten ja nicht besitzen :s

    Und auch wenn es nur Logik ist, an deren Umsetzung hat er ja entsprechend Hilfe benötigt. Zudem:

    Sky Super schrieb:

    Ich habe keine PHP- oder JS-Kenntnisse


    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Vollzitat entfernt. ~Trade
    @Bore Habe deinen Code hier (http://phptester.net/) getestet: Gibt "Englisch" aus. Habe beide Standard-Sprachen getestet: "de" und "de-DE".
    //Edit: Seltsam, wenn ich die Sprache auf "en" einstelle, wird "Deutsch" ausgegeben... Wenn ich also beide austauschen würde...
    There are only 10 types of poeple in the world: Those who understand binary and those who don't.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Bore schrieb:

    Sorry, aber für so eine einfache Funktion muss man kein Experte sein[...]

    Schaden würde es aber sicher nicht. Nicht das ich einer wäre, aber:

    Die Sprachen im Header bestehen aus einem primary language tag, eine beliebige Anzahl von subtags und einer optimalen Angabe quality, welche angibt, wie stark der Benutzer diese Sprache präferiert.
    Ein simples strpos ist hier leider falsch. Beispiel: Die Sprache Degma, die laut Wikipedia im Delta-Gebiet Nigerias anzutreffen ist, besitzt das bei der IANA registrierte subtag deg, welches dein Code als Deutsch auswerten würde.
    (Aktuell gibt es 46 subtags die "de" enthalten, davon ca. 3/4 die nichts mit unserer Sprache zu tun haben.)
    [Edit: mal abgesehen davon, dass der Code die Stärke der Präferenzen vollkommen ignoriert, z.B. würde de; en;q=0.1 ebenfalls en liefern]

    @TE: Habe selbst mal was zusammengebastelt, viel Spaß:
    Spoiler anzeigen

    Anmerkung: Sprachen mit (z.B. de-de und ohne (z.B. de) subtag werden als unterschiedliche Sprachen gewertet.

    PHP-Quellcode

    1. function parseHttpAcceptedLang($s, $preserveOrder=true) {
    2. $langs = [];
    3. if(preg_match_all('/(\w+(?:-\w+)*)(?:\s*;\s*q\s*=\s*(\d+(?:\.\d+)?))?/', $s, $m)) {
    4. $eps = $preserveOrder ? 0.0001 : 0.0;
    5. for($i = 0, $n = count($m[0]); $i < $n; ++$i) {
    6. $tag = trim($m[1][$i]);
    7. $q = trim($m[2][$i]);
    8. $langs[$tag] = (strlen($q) > 0 ? (float)$q : 1.0) + $eps*($n-$i);
    9. }
    10. arsort($langs, SORT_NUMERIC);
    11. }
    12. return $langs;
    13. }
    14. function getPreferredLangFromHttp(array $accepted, $default) {
    15. $langs = parseHttpAcceptedLang($_SERVER['HTTP_ACCEPT_LANGUAGE']);
    16. foreach($langs as $tag => $q) {
    17. if(in_array($tag, $accepted)) {
    18. return $tag;
    19. }
    20. }
    21. return $default;
    22. }
    23. $lang = getPreferredLangFromHttp(['de', 'en'], 'en');


    [Edit: das sollte halbwegs wasserdicht sein. Wer Fehler findet bitte melden :)]


    Du solltest aber beachten, dass das mehr oder weniger nur eine Empfehlung für den Webserver ist. Der Benutzer sollte stets die Möglichkeit haben, sich auch die Versionen in anderen Sprachen anzeigen zu lassen. Umsetzen kannst du das ja so:
    www.example.com/seite leitet abhängig von der erkannten Sprache per HTTP-Redirect (302) auf www.example.com/<lang>/seite um. Auf www.example.com/<lang>/seite wird der Accept-Language-Header ignoriert (keine Umleitung) und es gibt Links (Bilder mit Länderflagge, Dropdown, whatever) zu den anderen Versionen.

    Edit 2:
    @Bore Du meintest sicher auch strpos($sprache,"de") === false (3x Gleichheitszeichen). Andernfalls geht er auch bei $sprache = 'de' in den If-Zweig.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „3daycliff“ () aus folgendem Grund: Typo

    3daycliff schrieb:

    Der Benutzer sollte stets die Möglichkeit haben, sich auch die Versionen in anderen Sprachen anzeigen zu lassen
    Ist mir bewusst. Und diese Funktion war schon von Anfang an eingebaut.
    //Edit: @3daycliff: Mit deinem Code habe ich ein kleines Problem: Wie soll ich das Resultat auswerten? Dank VB.NET-Kenntnissen verstehe ich einen Minimum von deinem Code, bin mir trotzdem sicher dass er "nur" die Browser-Sprache ermittelt, nicht aber auf die entsprechende Seite weiterleitet. Wie bereits erwähnt: ich besitze keinerlei Kenntnisse bezüglich von PHP.

    Seltsame Formatierung entfernt. ~Trade

    There are only 10 types of poeple in the world: Those who understand binary and those who don't.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Trade“ ()

    Kommt drauf an wie der Rest so aufgebaut ist. Hier mal zwei Beispiele:

    PHP-Quellcode

    1. header('Location: /'.$lang.'/meine-tolle-seite', true, 302);

    PHP-Quellcode

    1. if($lang === 'de') {
    2. header('Location: /impressum', true, 302);
    3. }
    4. elseif($lang === 'en') {
    5. header('Location: /legal-notice"', true, 302);
    6. }
    7. else {
    8. header('Location: /ups', true, 302);
    9. }


    Es darf vorher aber keine Ausgabe (echo, print, ..., Fehlermeldungen etc.) erfolgen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „3daycliff“ () aus folgendem Grund: Typo...

    Ergibt folgendes:

    Quellcode

    1. Parse error: syntax error, unexpected '[' in /home/www/cwcity/hosting/s/k/skysuper/htdocs/langswitch.php on line 24

    Mit Linie 24 ist folgende gemeint (siehe Post 8):

    Quellcode

    1. $langs = [];
    [//Edit: Falls es jemanden interessiert, hier ist mein bisheriger Code:
    Spoiler anzeigen

    HTML-Quellcode

    1. <html>
    2. <head>
    3. <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    4. <title>Sprache</title>
    5. <style>
    6. body {
    7. font-family: "Segoe UI Semilight", "Segoe UI", "Futura Md", Helvetica, Sans-serif, Arial;
    8. }
    9. a {
    10. text-decoration: none;
    11. color: blue;
    12. }
    13. a:hover {
    14. text-decoration: underline;
    15. text-shadow: 0px 0px 15px blue;
    16. }
    17. </style>
    18. </head>
    19. <body>
    20. <?php
    21. function parseHttpAcceptedLang($s, $preserveOrder=true) {
    22. $langs = [];
    23. if(preg_match_all('/(\w+(?:-\w+)*)(?:\s*;\s*q\s*=\s*(\d+(?:\.\d+)?))?/', $s, $m)) {
    24. $eps = $preserveOrder ? 0.0001 : 0.0;
    25. for($i = 0, $n = count($m[0]); $i < $n; ++$i) {
    26. $tag = trim($m[1][$i]);
    27. $q = trim($m[2][$i]);
    28. $langs[$tag] = (strlen($q) > 0 ? (float)$q : 1.0) + $eps*($n-$i);
    29. }
    30. arsort($langs, SORT_NUMERIC);
    31. }
    32. return $langs;
    33. }
    34. function getPreferredLangFromHttp(array $accepted, $default) {
    35. $langs = parseHttpAcceptedLang($_SERVER['HTTP_ACCEPT_LANGUAGE']);
    36. foreach($langs as $tag => $q) {
    37. if(in_array($tag, $accepted)) {
    38. return $tag;
    39. }
    40. }
    41. return $default;
    42. }
    43. $lang = getPreferredLangFromHttp(['de', 'en'], 'en');
    44. if($lang === 'de') {
    45. header('Location: /impressum', true, 302);
    46. }
    47. elseif($lang === 'en') {
    48. header('Location: /legal-notice"', true, 302);
    49. }
    50. else {
    51. header('Location: /ups', true, 302);
    52. }?></body></html>
    There are only 10 types of poeple in the world: Those who understand binary and those who don't.

    Bore schrieb:

    Warum umständlich machen, wenn es auch einfach geht:


    Bore schrieb:

    if(strpos($sprache,"de") == false)


    Wenn dann brauchste aber auch === false anstatt == false. Macht einen Unterschied ;).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Na in deiner Signatur. Da kommt man dann hier raus: http://skysuper.cwsurf.de/en" (wo dann steht "Die Seite ist gerade im Urlaub"). Und richtig wäre http://skysuper.cwsurf.de/en

    Link :thumbup:
    Hello World