Autodetect Sprache
Autodetect Sprache
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
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
Re: Autodetect Sprache
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.HelmutL wrote: ↑Wed May 02, 2018 9:57 amAllerdings: 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.
Christoph M. Becker – Plugins for CMSimple_XH
Re: Autodetect Sprache
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
Das muss ich noch genauer erforschen.
Helmut
Re: Autodetect Sprache
Dann sieht Google aber nur Deine englischsprachigen Seiten, denn Googlebot ist Englisch sprechender Amerikaner. Wenn Dich das nicht stört, mach' das so.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).
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.
Re: Autodetect Sprache
Danke, sehr wichtiger Hinweis! (siehe auch https://support.google.com/webmasters/a ... 4055?hl=de)meltemi wrote: ↑Wed May 02, 2018 9:26 pmDann sieht Google aber nur Deine englischsprachigen Seiten, denn Googlebot ist Englisch sprechender Amerikaner. Wenn Dich das nicht stört, mach' das so.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).
Möglicherweise ist https://github.com/cmb69/polyglott_xh/i ... -330519090 ein guter Ansatz, um auch dieses Problem in den Griff zu bekommen.
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
Re: Autodetect Sprache
Meine derzeitige Installation zum Test:
localhost/cms
Sprache Deutsch (de), zweite Sprache Englisch (en)
Script in userfuncs.php:
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 ? ist vor dem Aufruf von noch richtig, d.h. ohne das zusätzliche "/en".
Grüße
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();
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
Code: Select all
header()
Grüße
Re: Autodetect Sprache
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();
}
Christoph M. Becker – Plugins for CMSimple_XH
Re: Autodetect Sprache
Vielen Dank.
Damit kann ich einmal leben (und vielleicht ist das für mich ein Ansatz zu weiteren Experimenten).
Damit kann ich einmal leben (und vielleicht ist das für mich ein Ansatz zu weiteren Experimenten).
Re: Autodetect Sprache
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.
Ich danke nochmals allen, die mir mit ihren Hinweisen geholfen haben, eine Lösung zu finden.
Helmut
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();
Helmut