Toon de juiste Magento storeview taal automatisch per bezoeker

Magento maakt het mogelijk om per webshop meerdere talen in te richten. Dat doe je door voor iedere taal een aparte storeview of winkelzicht in te richten. Daarna kan je de juiste domeinextensie koppelen aan de juiste taal in de index.php van Magento. In dit artikel ga ik ervan uit dat je weet hoe dit mechanisme werkt.

Hartstikke mooi natuurlijk dat wanneer iemand naar www.jouwdomein.com gaat hij de engelstalige versie van je Magento webshop te zien krijgt en als hij naar www.jouwdomein.nl gaat de nederlandstalige versie van je Magento webshop te zien krijgt.

Maar het zou nog mooier zijn dat jouw Maggento webshop kan detecteren welke taal jouw bezoeker spreekt en op basis daarvan de juiste taal en storeview in Magento aan je bezoeker voorschotelt. Met een kleine aanpassing in de index.php kan je dat snel voor elkaar krijgen!

Hoe moet het niet?

Als je in Google zoekt op “Magento show store view based on language”, vind je onder andere dit artikel waarin staat uitgelegd hoe je dit zou moeten doen.

Helaas heeft deze aanpak een heel groot nadeel:
Al je links veranderen in je Magento webshop doordat je de storeview code in je url aan moet zetten. Daardoor raak je in één keer je zo zorgvuldig opgebouwde Google ranking en links vanuit andere sites naar jouw Magento webshop kwijt. 

Hoe moet het dan wel?

Je kan op twee manieren achterhalen welke taal je gebruiker spreekt:

  1. Door zijn land van herkomst te achterhalen.
  2. Door de taalinstelling van zijn browser te achterhalen.

Voor beide methodes is  wat te zeggen, maar ik geef er de voorkeur aan om voor optie twee te kiezen. Het land van herkomst zegt niet altijd iets over de taal die iemand spreekt. Er wonen bijvoorbeeld duizenden Nederlanders (tijdelijk) in het buitenland en die hebben hun browser (en systeem) hoogstwaarschijnlijk ingesteld staan op Nederlands. Een Nederlander in Frankrijk is er dan meer bij gebaat om je Magento webshop in het Nederlands aangeboden te krijgen dan in het Frans.

De code is ontwikkeld op basis van de volgende uitgangspunten:

  1. Als de gebruiker expliciet kiest voor een domein extensie die overeen komt met een taal in je Magento webshop, laat dan die taal zien.
  2. Als de gebruiker op het hoofddomein van je Magento webshop binnenkomt, kijk dan naar de taalinstellingen van de gebruiker en switch naar de juiste taal.
  3. De code voor de nederlandstalige storeview = ‘nl’, de code voor de engelstalige storeview = ‘en’

Voeg daarvoor de volgende code in de index.php toe:

umask(0);

/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

function getLanguage()
{
    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
        foreach (explode(",", strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])) as $accept) {
            if (preg_match("!([a-z-]+)(;q=([0-9.]+))?!", trim($accept), $found)) {
                $langs[] = $found[1];
                $quality[] = (isset($found[3]) ? (float)$found[3] : 1.0);
            }
        }
// Order the codes by quality
        array_multisort($quality, SORT_NUMERIC, SORT_DESC, $langs);
// get list of stores and use the store code for the key
        $stores = Mage::app()->getStores(false, true);
// iterate through languages found in the accept-language header
        foreach ($langs as $lang) {
            $lang = substr($lang, 0, 2);
            if (isset($stores[$lang]) & amp;
            &
            amp;
            $stores[$lang]->getIsActive()) {
                return $lang;
            }
}
    }
    return null;
}

/* First check if user has chosen for a specific language domain, in this case dutch */
switch ($_SERVER['HTTP_HOST']) {
    case 'jouwdomein.nl':
    case 'www.jouwdomein.nl':
        $mageRunCode = 'nl';
        break;
    default:
        /* user did not check for specific language domain, so auto redirect to language store view based on browser language (if available) */
        $lang = getLanguage();
        switch ($lang) {
            case 'nl':
                $mageRunCode = 'nl';
                break;
            default:
                $mageRunCode = 'en';
                break;
        }
        break;
}

Mage::run($mageRunCode, $mageRunType);

Als je meerdere domein extensies gebruikt en je wilt dat deeplinks vanuit andere websites en Google ook naar de juiste deeplink in je taaldomein verwijzen moet je nog één ding extra instellen: Ga naar System->Configuration->Web->url-options en zet Auto-redirect to Base URL op No.

Je Magento webshop wordt nu getoond in de taal die overeenkomt met de taalinstelling van de browser van je bezoeker en al je links zijn gelijk gebleven. Hoe cool is dat!

Deel dit met anderen

Ed de Tollenaer

8 Responses

  • Gerben

    Hi Ed,

    Leuk artikel, hoe voeg ik -naast de Nederlandse en Engelse taal de Spaanse + Duitse taal ook toe aan dit script?
    Dat zou erg mooi zijn.

    • Ed de Tollenaer

      Op dezelfde manier. Maak twee storeviews aan met de codes de en es.
      Pas daarna de index.php aan voor deze twee codes.

  • Nick

    Mooi artikel, en mooi website, maar waarom heb je rechts klikken uitgezet? Op deze manier moet ik de code opzoeken in de source en zo kopieeren om er achter te komen dat die niet zo lekker werkt. Jammer, want volgens mij staan er echt super handige dingen op deze website!

  • Faas Vriend

    Hoi,
    Zodra ik deze code post in mn index.php, is mn website elke keer helemaal wit en als ik bij ‘element inspecteren’ kijk, is er nog niet eens iets… Maar als ik de code weer weg haal werkt de website weer… Hoe kan dit?

  • Frans

    Werkt perfect, echter als een gebruiker de taal met de switcher heeft ingesteld op een andere taal dan hij/zij in de browser gebruikt wordt dit bij ieder paginawissel weer ongedaan gemaakt en wordt de taal van de browser weer toegepast.
    Zou het mogelijk zijn om de automatische taalinstelling alleen toe te passen bij het eerste openen van de site?

Geef een reactie op Faas Vriend / Cancel Reply