PHP-Skript für eine automatische Sprachumschaltung (GeoLoc.)

[code]Hallo Shopware-Community, ich habe ein PHP-Skript geschrieben, das anhand der Ip-Nummer das Besucher-Land ermittelt und die Besucher auf den Deutschen oder auf den Englischen-Shop weiterleitet, damit der Shop und seine Elemente in der jeweiligen Sprache automatisch dargestellt werden. Bitte vorher den Teil meinshop/de/ ersetzen und den Source-Code als index.php in das root-Verzeichnis hochladen. Das war es schon, viel Spaß damit. :thumbup: Bedient euch :smiley: [code]<?php $GERMANSHOP = „meinshop/de/“; /* Bitte ersetzen mit eigener Pfad /
$ENGLISHSHOP = „meinshop/en/“; /
Bitte ersetzen mit eigener Pfad */

FOR SESSION RECORD START 15.05.2013 cengizkan bilgic#########

$ip = getenv(„REMOTE_ADDR“);
hostadr = gethostbyaddr(_SERVER[‚REMOTE_ADDR‘]);
$ctime=time();
$datehour = date(„d.m.Y H:i“);

########### START GEOLOCATE 15.05.2013 cengizkan bilgic #########

$server = ‚whois.ripe.net‘;

if (!($fp = fsockopen($server, 43))) {
die(‚Could not connect to ‚.$server.‘.‘);
}

fwrite($fp, $ip."\r\n");

$result = ‚‘;
while (!feof($fp)) {
$result .= fread($fp, 1024);
}

fclose($fp);

$country =‚country:‘;

$abcountry = str_replace(’ ', ‚‘, $result);
$abcountrypos = strpos($abcountry, $country);
$abcountrypos = $abcountrypos+8;
$abcountry = substr($abcountry,$abcountrypos,‚2‘);

$$abcountry = strtoupper($abcountry);

if ($abcountry ==‚DE‘ OR $abcountry ==‚AT‘){
header(„Location: $GERMANSHOP“);
} ELSE {
header(„Location: $ENGLISHSHOP“);
}

?>[/code] [/code]

den Code habe ich jetzt nochmal angepasst, die IP-Ermittlung funktioniert jetzt viel besser. :thumbup:

1 „Gefällt mir“

Hallo Cengizkan Ist es nicht besser anhand einer Domain den User in den richtigen Sprachshop zu leiten? Ich habe 2 Domains domain.de und domain.com und möchte dann die auch auf die richtige Sprache weiterleiten. domain.de => shop.domain.de/de domain.com => shop.domain.de/en Nur in den root-Ordner legen reicht glaube ich nicht. Da als erstes die .htaccess greift und gleich die shopware.php benutzt wird doch die index.php übersprungen, oder? Über Hilfe wäre ich sehr dankbar. LG mirko

@Cengizkan Vielen Dnak für das Skript. ich bin aber auch der Meinung, dass ein einfaches Ablegen als index.php im root-verzeichnis nichts nützt. m.E. ist das Umleiten auf Grund der IP auch nicht sinnvoll. Viel mehr Sinn würde es machen die eingestellte Sprache des Browsers abzufragen.

Hallo zusammen, damit die Weiterleitung funktioniert sollten die Shopwaredateien in einem separaten Verzeichnis liegen wie z.B. handyshop/ und die index.php sollte dann im übergeordnetem Root-Verzeichnis erstellt werden. Für einige Webserver (je nach Konfiguration) ist es besser, wenn im Root-Verzeichnis noch eine index.html erstellt wird. Es reicht wenn die index.html folgenden Inhalt hat:

LG, Cengizkan

Ist es möglich diese Funktion auf Basis der Browsersprache zu verwenden?? Sprich… Benutzer mit englischsprachigem Browser wird auf shop.com/en weitergeleitet … Benutzer mit deutschsprachigem Shop wird auf shop.com/de weitergeleitet.

Ich verwende das hier. <?php $lc = ""; // Initialize the language code variable // Check to see that the global language server variable isset() // If it is set, we cut the first two characters from that string if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } // Now we simply evaluate that variable to detect specific languages if($lc == "de"){ header("location: http://www.domain.de/de/"); exit(); } else if($lc == "en"){ header("location: http://www.domain.de/en/"); exit(); } ?>

1 „Gefällt mir“

Danke! Und dieser Code zeigt den Shop jeweils anhand der eingestellten Browsersprache, richtig? Wie bzw. wo genau muss ich das Skript implementieren?

Aso sorry wie bei dem anderen auch einfach eine index.php erstellen. Dann die URL anpassen, und dann einfach die Sprache im Browser ändern und testen.

1 „Gefällt mir“

Klappt super! Das einzige ist, dass der zwar die Webseite in der richtigen Sprache anzeigt, aber die Flagge wechselt nicht in z.b. die englisch sondern zeigt weiterhin die deutsche. Wenn es hierfür noch eine Lösung gibt wäre das perfekt!

Also bei mir klappt das, eventuell kann sich das ja jemand anschauen der sich mit PHP auskennt.

Vielleicht liegt das auch an meinem Responsive Theme das ich verwende. Welches Theme verwendest du?

Ich verwende das Conexco Responsive Template, mit der Demo läuft es aber auch.

Hmm… also wie ich. Verwende das auch.

[quote=“bombfrog”]Ich verwende das hier. <?php $lc = ""; // Initialize the language code variable // Check to see that the global language server variable isset() // If it is set, we cut the first two characters from that string if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } // Now we simply evaluate that variable to detect specific languages if($lc == "de"){ header("location: http://www.domain.de/de/"); exit(); } else if($lc == "en"){ header("location: http://www.domain.de/en/"); exit(); } ?>[/quote] Erst einmal vielen Dank bombfrog! Ich habe deine Script in eine index.php auf dem Root Verzeichnis abgelegt Shopware liegt in einem Unterverzeichnis shopware/. Dennoch funktioniert das Script nicht bei mir. Egal welche Sprache ich in meinem Browser einstelle, ich gelange immer auf den deutschen Shop. Meine Frage ist, habe ich die index.php an der falschen Stelle eingefügt? In das Shopware Verzeichnis kann es ja nicht rein, weil sonst die shopware.php nicht ausgeführt wird und somit eine Blankpage bekomme. Ich habe es auch mal versucht mit Javascript zu lösen. Aber anscheinend klappt das auch nicht so richtig. var lastURL = document.referrer; var suche = lastURL.search("meinShop.de"); //alert(suche); // Nur ausführen wenn man von einer fremden Webseite auf meinShop.de gelangt. if(suche == -1){ if (navigator.language == "fr" || navigator.language == "fr-ch"){ window.location = "http://www.meinShop.de/fr"; } }

Eventuell liegt es auch an den Grundeinstellungen. Bei mir sieht das so aus: Shop 1: Host: www.domain.de Virtuelle URL: /de Lokalisierung: Deutsch Shop 2: Virtuelle URL: /en Lokalisierung: Englisch Eventuell liegt es auch an der .htaccess bzw. mod_rewrite wenn du Apache verwendest. <?php $lc = ""; // Initialize the language code variable // Check to see that the global language server variable isset() // If it is set, we cut the first two characters from that string if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } // Now we simply evaluate that variable to detect specific languages if($lc == "de"){ header("location: http://www.domain.de/de/"); exit(); } else if($lc == "en"){ header("location: http://www.domain.de/en/"); exit(); } ?>

Ich hab noch ein anderes Skript gefunden welches bei mir auch läuft: [code]<?php // Needs to be first line of page.
/*
Language Browser Language Detection and Redirect
Version 1.0
August 21, 2010

Will Bontrager
http://www.willmaster.com/
Copyright 2010 Bontrager Connection, LLC

Bontrager Connection, LLC grants you
a royalty free license to use or modify
this software provided this notice appears
on all copies. This software is provided
„AS IS,“ without a warranty of any kind.
*/

$Destination[‚de‘] = ‚http://www.domain.de/de/‘;
$Destination[‚en‘] = ‚http://www.domain.de/en/‘;

$DefaultDestination = ‚http://www.domain.de/de/‘;

// No other customization required. //
//////////////////////////////////////
lang = preg_replace('/;.*/’,’’,$_SERVER[‚HTTP_ACCEPT_LANGUAGE‘]);
lang = preg_replace('/,.*/’,’’,strtolower($lang));
$dest = ‚‘;
if( isset($Destination[$lang]) ) { $dest = $Destination[$lang]; }
if( empty($dest) )
{
$lang = substr($lang,0,2);
if( isset($Destination[$lang]) ) { $dest = $Destination[$lang]; }
else { $dest = $DefaultDestination; }
}
if( ! empty($dest) )
{
header(„Location: $dest“);
exit;
}
?>[/code]

1 „Gefällt mir“

@bomfrog Bei mir klappen auch beide. Danke! Wie gesagt… bis auf den Flaggen-Wechsel. Welche Conexco Responsive Template Version hast du?

1.7.0 (Nginx) im Livebetrieb, und 1.5.3 (Apache2/Uwamp) auf der lokalen Testumgebung. Ich habe das ganze mit dem normalem Template (ohne Änderungen) getestet, und mit meinen Anpassungen im Ordner “_theme”. Ich glaube auch nicht unbedingt das es an dem Template liegt, da es wie gesagt auf dem Standard Template “Emotion” auch läuft.

Mir ist aufgefallen, dass der Browser immer das anzeigt, was als letztes (vor dem Schließen) aktiv war. Sprich… Webseite wird in englischer Version aufgerufen, also mit englischer Flagge. Danach wird der Browser geschlossen. Beim erneuten Öffnen erkennt die Webseite anhand des Skripts die Browsersprache (deutsch), zeigt also korrekt die deutsche Webseitenversion an aber weiterhin die Englische Flagge, da diese als letztes aktiv war (vor dem Schließen). Kann es sein, dass das am APC Cache liegt, dass der Flaggen-Wechsel nicht reibungslos funktioniert?