Autodetect Sprache

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
Post Reply
HelmutL
Posts: 9
Joined: Wed May 02, 2018 9:28 am

Autodetect Sprache

Post by HelmutL » Wed May 02, 2018 9:57 am

Hallo,

ich möchte eine mehrsprachige Website erstellen. Z.B. default Englísch, zweite Sprache Deutsch, eventuell noch Französisch. Das funktioniert soweit und ich kann mit languagemenu() die Sprache umschalten.

Jetzt möchte ich, dass der Benutzer automatisch (abhängig von der im Browser eingestellten Sprache) auf die richtigen Seiten umgeleitet wird (also deutsch, eventuell Französisch, sonst Englisch).
Ich habe versucht das mit den userfuncs.php aus viewtopic.php?f=5&t=5905&p=34434&hilit= ... age#p34437 zu realisieren.
Die Erkennung der Sprache (und Aufruf der richtigen Seiten) funktioniert damit anscheinend.

Allerdings: dann funktioniert die "manuelle" Umschaltung mit languagemenu() nicht mehr (sucht nicht vorhandene subdirectories). Auf dieseMöglichkeit möchte ich nicht verzichten, denn es könnte doch sein, dass ein Italiener (kein IT, d.h. geht auf default Englisch) liber Französisch als Englisch hätte.

Hat jemand dazu einen Vorschlag ?

Vielen Dank
Helmut

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Autodetect Sprache

Post by cmb » Wed May 02, 2018 11:25 am

HelmutL wrote:
Wed May 02, 2018 9:57 am
Allerdings: dann funktioniert die "manuelle" Umschaltung mit languagemenu() nicht mehr (sucht nicht vorhandene subdirectories). Auf dieseMöglichkeit möchte ich nicht verzichten, denn es könnte doch sein, dass ein Italiener (kein IT, d.h. geht auf default Englisch) liber Französisch als Englisch hätte.
Ersetze mal languagemenu() mit Autolang_menu(), das sollte es dann möglich machen, die automatisch erkannte Sprache zu übersteuern, indem ein entsprechendes Cookie gesetzt wird.
Christoph M. Becker – Plugins for CMSimple_XH

HelmutL
Posts: 9
Joined: Wed May 02, 2018 9:28 am

Re: Autodetect Sprache

Post by HelmutL » Wed May 02, 2018 1:05 pm

Vielen Dank. Damit sieht es schon besser aus. Allerdings habe ich das mit dem Cookie noch nicht ganz behirnt, es ist also noch nicht so, wie ich gerne hätte.
Das muss ich noch genauer erforschen.

Helmut

meltemi
Posts: 177
Joined: Sat Feb 22, 2014 10:11 pm
Location: Franken (Deutschland)
Contact:

Re: Autodetect Sprache

Post by meltemi » Wed May 02, 2018 9:26 pm

HelmutL wrote:Jetzt möchte ich, dass der Benutzer automatisch (abhängig von der im Browser eingestellten Sprache) auf die richtigen Seiten umgeleitet wird (also deutsch, eventuell Französisch, sonst Englisch).
Dann sieht Google aber nur Deine englischsprachigen Seiten, denn Googlebot ist Englisch sprechender Amerikaner. Wenn Dich das nicht stört, mach' das so.

Der Vollständigkeit halber: das gleiche gilt für automatische Sprachweiterleitungen anhand der IP-Adresse.

P.S.
Hast Du für Deine mehrsprachige Website (wie von Google empfohlen) Sprachanmerkungen (hreflang) vorgesehen? Die funktionieren auch nur ohne automatische Sprachweiterleitungen.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Autodetect Sprache

Post by cmb » Wed May 02, 2018 9:51 pm

meltemi wrote:
Wed May 02, 2018 9:26 pm
HelmutL wrote:Jetzt möchte ich, dass der Benutzer automatisch (abhängig von der im Browser eingestellten Sprache) auf die richtigen Seiten umgeleitet wird (also deutsch, eventuell Französisch, sonst Englisch).
Dann sieht Google aber nur Deine englischsprachigen Seiten, denn Googlebot ist Englisch sprechender Amerikaner. Wenn Dich das nicht stört, mach' das so.
Danke, sehr wichtiger Hinweis! (siehe auch https://support.google.com/webmasters/a ... 4055?hl=de)

Möglicherweise ist https://github.com/cmb69/polyglott_xh/i ... -330519090 ein guter Ansatz, um auch dieses Problem in den Griff zu bekommen.
meltemi wrote:
Wed May 02, 2018 9:26 pm
Der Vollständigkeit halber: das gleiche gilt für automatische Sprachweiterleitungen anhand der IP-Adresse.
Auf solches würde ich grundsätzlich verzichten, allein deshalb, weil Land ungleich Sprache. Beispiel: ich mache Urlaub in Italien – da will ich trotzdem Deutsch oder Englisch lesen, nicht Italienisch, weil ich das leider nicht verstehe.
Christoph M. Becker – Plugins for CMSimple_XH

HelmutL
Posts: 9
Joined: Wed May 02, 2018 9:28 am

Re: Autodetect Sprache

Post by HelmutL » Fri May 04, 2018 9:33 am

Meine derzeitige Installation zum Test:

localhost/cms
Sprache Deutsch (de), zweite Sprache Englisch (en)

Script in userfuncs.php:

Code: Select all

<?php

function Autolang_languages()
{
    global $pth, $cf;

    $languages = array();
    $dn = $pth['folder']['base'];
    $dh = opendir($dn);
    while (($fn = readdir($dh)) !== false) {
        if (is_dir($dn . $fn) && preg_match('/^[A-z]{2}$/', $fn)) {
            $languages[] = $fn;
        }
    }
    if ($dh) {
        closedir($dh);
    }
    sort($languages);
    array_unshift($languages, $cf['language']['default']);
    return $languages;
}

function user_language()
{
    $language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 
    return $language;
}


function Autolang()
{
    global $sn, $sl, $cf;

    $languages = Autolang_languages();
    $userLang = user_language();

    if (!$userLang) {
        exit;
    }

    if (!in_array($userLang, $languages)) {
        $userLang = $languages[0];
    }

    if ($userLang != $languages[0]) {
        header("Location: $sn$userLang/", true, 303);
        exit;
    }
}

Autolang(); 
zum Umschalten der Sprache verwende ich polyglott_languagemenu() (der User soll die Möglichkeit haben, unabhängig von der automatisch eingestellten Sprache eine andere zu wählen).

Das Script funktioniert, wenn die default Sprache verwendet werden soll (z.B. bei Einstellungen im Browser "de" oder "fr").
Bei der Einstellung von "en" im Browser wird aber auf "localhost/cms/en/en/" umgeleitet statt richtigerweise auf "localhost/cms/en/"

Gibt es da eine Erklärung und Lösung ?

Code: Select all

$sn$userLang
ist vor dem Aufruf von

Code: Select all

header()
noch richtig, d.h. ohne das zusätzliche "/en".

Grüße

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Autodetect Sprache

Post by cmb » Fri May 04, 2018 10:46 am

HelmutL wrote:
Fri May 04, 2018 9:33 am
Das Script funktioniert, wenn die default Sprache verwendet werden soll (z.B. bei Einstellungen im Browser "de" oder "fr").
Bei der Einstellung von "en" im Browser wird aber auf "localhost/cms/en/en/" umgeleitet statt richtigerweise auf "localhost/cms/en/"
Stimmt! Das Problem ist, dass das Skript zunächst auf localhost/cms/en/ weiterleitet, und es dort erneut greift, was in localhost/cms/en/en/ resultiert. Die einfachste Lösung wäre das Skript nur dann greifen zu lassen, wenn keine Zweitsprache direkt aufgerufen wird; dazu einfach die letzte Zeile ersetzen durch:

Code: Select all

if ($sl == $cf['language']['default']) {
    Autolang();
}
Wird direkt eine Zweitsprache abgerufen, dann gibt es keine Weiterleitung. Das ist auch gut für die (polyglott_)languagemenu() Links – allerdings funktionieren diejenigen zur Hauptsprache eben trotzdem nicht mehr.
Christoph M. Becker – Plugins for CMSimple_XH

HelmutL
Posts: 9
Joined: Wed May 02, 2018 9:28 am

Re: Autodetect Sprache

Post by HelmutL » Fri May 04, 2018 11:08 am

Vielen Dank.
Damit kann ich einmal leben (und vielleicht ist das für mich ein Ansatz zu weiteren Experimenten).

HelmutL
Posts: 9
Joined: Wed May 02, 2018 9:28 am

Re: Autodetect Sprache

Post by HelmutL » Sun May 06, 2018 6:22 am

Ich habe jetzt einen Weg gefunden, der für mich gut funktioniert. Es wird ein Session-Cookie verwendet um Autolang() nur einmal aufzurufen. Damit bleibt auch die Möglichkeit der späteren manuellen Sprachumschaltung erhalten.

Code: Select all

<?php

function Autolang_languages()
{
    global $pth, $cf;

    $languages = array();
    $dn = $pth['folder']['base'];
    $dh = opendir($dn);
    while (($fn = readdir($dh)) !== false) {
        if (is_dir($dn . $fn) && preg_match('/^[A-z]{2}$/', $fn)) {
            $languages[] = $fn;
        }
    }
    if ($dh) {
        closedir($dh);
    }
    sort($languages);
    array_unshift($languages, $cf['language']['default']);
    return $languages;
}

function user_language()
{
    $language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 
    return $language;
}


function Autolang()
{
    global $sn, $sl, $cf;

    $languages = Autolang_languages();
    $userLang = user_language();

    if (!$userLang) {
        exit;
    }

	if (isset($_COOKIE['autolang'])) {
		return;
	}

	setcookie('autolang', $userLang);

    if (!in_array($userLang, $languages)) {
        $userLang = $languages[0];
    }

    if ($userLang != $languages[0]) {
        header("Location: $sn$userLang/", true, 303);
        exit;
    }
}

Autolang();

Ich danke nochmals allen, die mir mit ihren Hinweisen geholfen haben, eine Lösung zu finden.

Helmut

Post Reply