
Si vous suivez ce blog régulièrement vous savez que nous parlons très rarement développement, code, PHP, MySql etc…
Pour une fois nous allons faire une exception en faisant un tutoriel qui vous permettra de transformer Prestashop en véritable boutique multilingue.
Car il ne faut pas se leurrer, Prestashop prétend que sa solution est multilingue, ce qui est parfaitement vrai au niveau des utilisateurs mais faux au niveau du référencement (même pour la version 1.2.3). Voici donc une méthode optimisée pour Prestashop 1.1 mais je pense que cela marche pour la version 1.2.3.
Préambule
Pour gérer le changement de langue, Prestashop utilise les cookies. Pour faire simple, quand vous arrivez sur un site Prestashop en français, le site stocke la valeur « Française » du cookie et dès que vous cliquez sur un drapeau pour changer de langue le site change la valeur du cookie. Problème: les moteurs de recherche sont incapables de stocker les cookies…
La conséquence sera que vos visiteurs pourront « switcher » les langues sans problème, mais Goolgle n’indexera votre site qu’avec la langue par défaut.
Par exemple, pour un client nous avons eu le problème suivant :
Le site était bilingue (Français / Espagnol) et la langue par défaut était le français. Nous avions donc pour un même produit 2 pages avec 2 URL (1 par langue) :
www.mon-site.com/01-mon-produit.html (pour le français)
www.mon-site.com/01-mi-producto.html (pour l’espagnol)
Mais Google, ne pouvant pas stocker les cookies, était incapable de voir un contenu dans une autre langue que la langue par défaut.
En effet, le code de Prestashop est fait de telle manière que si vous ne pouvez pas stocker de cookies, on vous rabat sur la langue par défaut (je simplifie).
Résultat, pour les deux URL de notre site nous avions le contenu en français (langue par défaut).
Vous imaginez les problèmes : Google.es indexait très mal les pages (puisque rien n’était en espagnol sauf l’URL), les visiteurs espagnols arrivant par Google.es avait un contenu en français, et on avait un gros duplicate content !
Un site…deux URL
La seule solution que nous avons trouvé fut de forcer la langue par défaut selon l’URL (le domaine plus précisément). Pour cela, nous avons au préalable créé le sous domaine es.mon-site.com qui pointe vers le même répertoire que www.mon-site.com.
N.B : Nous n’avons pas essayé mais normalement cela marche aussi avec un autre domaine (ex: www.mon-site.es)
Par exemple : si le domaine est www.mon-site.com, on force le français, et si le domaine est es.mon-site.com, on force l’espagnol.
Pour ce faire, il faut aller dans le dossier classes et ouvrir le fichier Tools.php
Vers la ligne 112, modifiez le code comme ceci (un grand merci à Julien Breux) :
/* Automatically detect language if not already defined */
if ( isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
$array = split(',', Tools::strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
// On force la langue selon le domaine
if($_SERVER['HTTP_HOST'] == 'www.mon-site.com') // FR
$array[0] = 'fr';
if($_SERVER['HTTP_HOST'] == 'es.mon-site.com') // ES
$array[0] = 'es';
Attention !!! Si vous souhaitez utiliser le mode multilingue sur votre admin, vous devez préciser que cela doit être appliqué seulement sur la partie publique de votre site. Pour cela, on va vérifier que l’URL n’est pas celle de l’admin.
Utilisez alors ce code à la place du précédent :
/* Automatically detect language if not already defined */
// On regarde si on se trouve dans l'admin ou non
if(ereg('admin', $_SERVER['REQUEST_URI']))
/* Ci dessus remplacer 'admin' par le répertoire de votre admin
Par exemple si l'url pour accéder à votre admin est www.mon-site.com/admin-boutique/
Rempalcer 'admin' par 'admin-boutique'
*/
$admin = 1;
if ( isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND $admin != 1)
$array = split(',', Tools::strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
// On force la langue selon le domaine
if($_SERVER['HTTP_HOST'] == 'www.mon-site.com') // FR
$array[0] = 'fr';
if($_SERVER['HTTP_HOST'] == 'es.mon-site.com') // ES
$array[0] = 'es';
A ce stade, vous êtes déjà bien avancé. Maintenant il faut faire une petite configuration qui forcera aussi les moteurs à bien indexer les URL des 2 langues.
Pour cela, allez dans le dossier classes et modifiez le fichier Configuratrion.php comme ci-dessous (merci à Cédric Girard) :
Vers la ligne 99
elseif (key_exists($key, self::$_CONF))
{
// MODIFICATION LANGUE PAR DEFAUT POUR LES ROBOTS
if($key=='PS_LANG_DEFAULT')
{
// Variable langue => on verifie le domaine et on force la langue
if($_SERVER['HTTP_HOST'] == 'www.mon-site.com') // FR
return '2'; // L'id du français
if($_SERVER['HTTP_HOST'] == 'es.mon-site.com') // ES
return '5'; // L'id de l'espagnol
}
else
return self::$_CONF[$key];
// FIN DE MODIFICATION
}
N.B : Pour avoir l’id de vos langues, il vous suffit d’aller dans votre admin, cliquez sur l’onglet « Outils » puis sur le sous onglet « Langues » et là vous aurez l’id de vos langues.
Maintenant que tout est optimisé pour les moteurs de recherche, il faut ré-optimisé le site pour le visiteur.
Pour cela, il faut modifier le module blocklanguages. Dans le dossier modules, puis le dossier blocklanguages, éditez le fichier blocklanguages.tpl comme si dessous :
Vers la ligne 3
<ul id="first-languages">
{foreach from=$languages key=k item=language name="languages"}
<li {if $language.iso_code == $lang_iso}class="selected_language"{/if}>
{if $language.iso_code != $lang_iso}
<!--On modifie les url selon le code iso de la langue -->
<a href="{if $language.iso_code == 'es'}http://es.mon-site.com{/if}{if $language.iso_code == 'fr'}http://www.mon-site.com{/if}" title="{$language.name}">{/if}
<img src="{$img_lang_dir}{$language.id_lang}.jpg" alt="{$language.name}" />
{if $language.iso_code != $lang_iso}</a>{/if}
</li>
{/foreach}
</ul>
N.B : Pour avoir le code iso de vos langues, il vous suffit d’aller au même endroit que pour l’id.
N.B 2 : Avec cette modification, vous passerez obligatoirement par l’accueil à chaque fois que vous changerez de langue. C’est embêtant mais on ne peut pas faire autrement.
Si vous utilisez un sous domaine et uniquement si vous utilisez un sous domaine, vous devez configurez ce sous domaine dans l’admin de votre boutique. Pour cela allez dans votre admin, cliquez sur l’onglet « Outils » puis sur le sous onglet « Sous domaines ». Ensuite, il vous suffit de cliquez sur nouveau et d’ajouter votre sous-domaine (dans notre cas « es »).
A ce niveau, et si vous avez tout bien suivi, tout va marcher.
Maintenant si vous souhaitez utiliser un sitemap, faites les modifications ci-dessous.
Il nous reste un problème avec le sitemap, il va donc falloir optimiser le module « gsitmap ». Je vous avoue que nous n’avons pas eu le temps de trop se pencher sur ce module et qu’il est donc très mal optimisé mais il marche …
Alors dirigez vous vers le dossier modules, puis gsitemap et éditez le fichier gsitemap.php.
A partir de la ligne environ 47, vous devez modifier le code comme il suit :
/// Modifications multilingue
private function _postProcess()
{
// On génére le fichier français
$link = new Link();
$fp = fopen($this->_filename, 'w');
$xml = new SimpleXMLElement('<urlset xmlns="http://www.google.com/schemas/sitemap/0.84"></urlset>');
// Catégories françaises
$categories = Db::getInstance()->ExecuteS('
SELECT c.id_category, c.level_depth, link_rewrite, DATE_FORMAT(date_add, \'%Y-%m-%d\') AS date_add, cl.id_lang
FROM '._DB_PREFIX_.'category c
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON c.id_category = cl.id_category
LEFT JOIN '._DB_PREFIX_.'lang l ON cl.id_lang = l.id_lang
WHERE l.`active` = 1 AND cl.`id_lang` = 2');
// Ci dessus mettre l'id de votre 1ere langue dans `id_lang` = 2
foreach($categories as $category)
{
if (($priority = 0.9 - ($category['level_depth'] / 10)) < 0.1)
$priority = 0.1;
$sitemap = $xml->addChild('url');
// On définie les urls des catégories françaises. Mettre le domaine définie pour la langue française
$sitemap->addChild('loc','http://www.mon-site.com'.htmlspecialchars($link->getCategoryLink($category['id_category'], $category['link_rewrite'])));
$sitemap->addChild('priority', $priority);
$sitemap->addChild('lastmod', $category['date_add']);
$sitemap->addChild('changefreq', 'monthly');
}
// Produit français
$products = Db::getInstance()->ExecuteS('
SELECT p.id_product, pl.link_rewrite, DATE_FORMAT(date_add, \'%Y-%m-%d\') AS date_add, pl.id_lang, cl.`link_rewrite` AS category, (
SELECT MIN(level_depth)
FROM '._DB_PREFIX_.'product p2
LEFT JOIN '._DB_PREFIX_.'category_product cp2 ON p2.id_product = cp2.id_product
LEFT JOIN '._DB_PREFIX_.'category c2 ON cp2.id_category = c2.id_category
WHERE p2.id_product = p.id_product) AS level_depth
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON p.id_product = pl.id_product
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND pl.`id_lang` = cl.`id_lang`)
LEFT JOIN '._DB_PREFIX_.'lang l ON cl.id_lang = l.id_lang
WHERE l.`active` = 1 AND pl.`id_lang` = 2' );
// Ci dessus mettre l'id de votre 1ere langue dans `id_lang` = 2
foreach($products as $product)
{
if (($priority = 0.7 - ($product['level_depth'] / 10)) < 0.1)
$priority = 0.1;
$sitemap = $xml->addChild('url');
// On définie les urls des produit français. Mettre le domaine définie pour la langue française
$sitemap->addChild('loc', 'http://www.mon-site.com'.htmlspecialchars($link->getProductLink($product['id_product'], $product['link_rewrite'], $product['category'])));
$sitemap->addChild('priority', $priority);
$sitemap->addChild('lastmod', $product['date_add']);
$sitemap->addChild('changefreq', 'weekly');
}
$xmlString = $xml->asXML();
fwrite($fp, $xmlString, Tools::strlen($xmlString));
fclose($fp);
$res = file_exists($this->_filename);
$this->_html .= '<h3 style="margin-bottom: 20px">';
$this->_html .= $res ? $this->l('Sitemap file successfully generated') : $this->l('Error while creating sitemap file');
$this->_html .= '</h3>';
// On génére le fichier de la 2eme langue
$link_es = new Link();
$fp_es = fopen($this->_filename_es, 'w');
$xml = new SimpleXMLElement('<urlset xmlns="http://www.google.com/schemas/sitemap/0.84"></urlset>');
// Catégories de la 2eme langue
$categories = Db::getInstance()->ExecuteS('
SELECT c.id_category, c.level_depth, link_rewrite, DATE_FORMAT(date_add, \'%Y-%m-%d\') AS date_add, cl.id_lang
FROM '._DB_PREFIX_.'category c
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON c.id_category = cl.id_category
LEFT JOIN '._DB_PREFIX_.'lang l ON cl.id_lang = l.id_lang
WHERE l.`active` = 1 AND cl.`id_lang` = 5');
// Ci dessus mettre l'id de votre 2eme langue dans `id_lang` = 5
foreach($categories as $category) {
if (($priority = 0.9 - ($category['level_depth'] / 10)) < 0.1)
$priority = 0.1;
$sitemap = $xml->addChild('url');
// On définie les urls des catégories de la 2eme langue. Mettre le domaine définie pour la 2eme langue
$sitemap->addChild('loc','http://es.mon-site.com'.htmlspecialchars($link->getCategoryLink($category['id_category'], $category['link_rewrite'])));
$sitemap->addChild('priority', $priority);
$sitemap->addChild('lastmod', $category['date_add']);
$sitemap->addChild('changefreq', 'monthly');
}
$products = Db::getInstance()->ExecuteS('
SELECT p.id_product, pl.link_rewrite, DATE_FORMAT(date_add, \'%Y-%m-%d\') AS date_add, pl.id_lang, cl.`link_rewrite` AS category, (
SELECT MIN(level_depth)
FROM '._DB_PREFIX_.'product p2
LEFT JOIN '._DB_PREFIX_.'category_product cp2 ON p2.id_product = cp2.id_product
LEFT JOIN '._DB_PREFIX_.'category c2 ON cp2.id_category = c2.id_category
WHERE p2.id_product = p.id_product) AS level_depth
FROM '._DB_PREFIX_.'product p
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON p.id_product = pl.id_product
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND pl.`id_lang` = cl.`id_lang`)
LEFT JOIN '._DB_PREFIX_.'lang l ON cl.id_lang = l.id_lang
WHERE l.`active` = 1 AND pl.`id_lang` = 5');
// Ci dessus mettre l'id de votre 2eme langue dans `id_lang` = 5
foreach($products as $product)
{
if (($priority = 0.7 - ($product['level_depth'] / 10)) < 0.1)
$priority = 0.1;
$sitemap = $xml->addChild('url');
// On définie les urls des produits de la 2eme langue. Mettre le domaine définit pour votre 2eme langue
$sitemap->addChild('loc', 'http://es.mon-site.com'.htmlspecialchars($link->getProductLink($product['id_product'], $product['link_rewrite'], $product['category'])));
$sitemap->addChild('priority', $priority);
$sitemap->addChild('lastmod', $product['date_add']);
$sitemap->addChild('changefreq', 'weekly');
}
$xmlString_es = $xml->asXML();
fwrite($fp_es, $xmlString_es, Tools::strlen($xmlString_es));
fclose($fp_es);
$res_es = file_exists($this->_filename_es);
$this->_html .= '<h3 style="margin-bottom: 20px">';
$this->_html .= $res_es ? $this->l('Sitemap file successfully generated') : $this->l('Error while creating sitemap file');
$this->_html .= '</h3>';
}
//// Fin modif
Avec cette technique, vous aurez 2 sitemaps (1 par langue). L’un s’appellera sitemap.xml, et l’autre sitemap_es.xml. Si vous vous sentez de modifier les noms vous pouvez.
Il vous faut 2 sitemaps car Google n’accepte pas des URL de 2 domaines différents dans le même sitemap. N’oubliez donc pas de poster les deux sitemaps sur votre compte « Outil pour les webmasters ».
Voilà c’est un peu compliqué mais à ce jour c’est la seule solution que nous avons trouvé pour un vrai site Prestashop en multilingue.
Si vous avez des questions n’hésitez pas. N’hésitez pas non plus à apporter vos compléments d’information.












64 commentaires
JM
12 septembre 2009 - 9:30
wow !
ckarone
14 septembre 2009 - 9:32
Bonjour,
Vraiment bien votre tuto, c’est ce qu’il me faut pour un projet en préparation, merci de partager.
Stephen
14 septembre 2009 - 10:16
@ckarone Avec plaisir ! Nous avons tellement galéré avec le référencement multilingue que si on peut aider quelques personnes… En plus je trouve Prestashop très discret sur le sujet ce qui est dommage.
Cédric GIRARD
14 septembre 2009 - 15:08
Bonjour
Très bon article, qui « regroupe » à peu près tout ce dont nous avions parlé sur le forum Prestashop :-)
Pas bête la génération du sitemap en deux fois dans le même module ! Par contre le sitemap_es.xml est généré dans le répertoire du site français ?
Au niveau des sous-domaines, ils pointent au même endroit ? Si oui, il faut impérativement vérifier à la volée si l’URL appelée est espagnole ou française.
Désolé je n’ai pas « tout » lu en détail ^_^
Stephen
14 septembre 2009 - 15:28
@Cédric GIRARD En fait les deux domaines pointent vers le même répertoire donc le sitemap_es.xml et sitemap.xml sont dans le même répertoire.
Merci pour ton travail sur le forum qui a grandement inspiré cet article.
Julien Breux
14 septembre 2009 - 23:22
Merci beaucoup pour cet article très pertinent, je fais un feedback de ce pas !
Stephen
15 septembre 2009 - 9:50
@Julien Breux Avec plaisir ! Merci pour le feedback
M&M
25 septembre 2009 - 20:21
Merci & Merci pr ce tuto !! en effet je trouve également que la gestion des langues pr le SEO est un point faible « majeur » de l’excellenttttt Presta :-)
Tropical Dream
26 septembre 2009 - 19:28
merci pour cet article. J’ai eu la reference du site de Julien Breux. Dès que mon site multilingue va être prêt, je vais me pencher sur ce tutoriel.
CMMC
26 septembre 2009 - 23:49
Bonsoir,
Très intéressant comme tuto notamment pour un newbie comme moi de voir comment réagissent les moteurs de recherche.
Est-ce que le Tip est compatible avec la 1.1.0.5 (après le temps que j’ai passé à comprendre et tout ce que j’ai modifié je n’ai pas le courage de mettre à jour…).
Est-ce que cela n’a pas créé pas de problème avec le SSL ?
Comme vous disiez dommage de revenir à l’accueil (comme sur Prestashop par exemple !).
En fait j’aurais pensé que cela serait plus simple par exemple de faire un duplicate content sur un sous-domaine et de modifier la langue par défaut ; est-ce que cela est théoriquement possible ?
Stephen
28 septembre 2009 - 10:11
@CMMC Cette technique a été travaillé pour la 1.1.0.5 justement. Je pense qu’elle est compatible avec la 1.2, mais comme nous n’avons pas testé je ne peux pas l’affirmer avec certitude.
- Pour le SSL je ne peux pas vous dire, je n’ai pas testé.
- Je vous déconseille fortement le duplicate content. Par contre faire un sous domaine avec un changement de la langue par défaut c’est un peu le principe de ce tuto.
ostero
28 septembre 2009 - 13:52
Bonjour,
En premier lieu, merci pour ce tuto . Je l’ai suivi à la lettre et il est très efficace en ce qui concerne la visibilité d’un site multilangue.
Selement je rencontre un petit hic. tout marche impeccable sauf que je n’ai plus accés à mon admin, il y aurait une erreur aux environs de la ligne 252 du fichier classes/cookie.php
Si vous avez une petites idée du problème….
En tout cas grand merci pour les efforts fait sur le thème du multilingue pour prestashop!!!
Stephen
28 septembre 2009 - 14:30
@ostero Bonjour, vous avez quelle version de Prestashop ?
ostero
28 septembre 2009 - 20:46
Merci pour la réponse en pm ;)
J’ai la V.1.1 , le message d’erreur exact c’est:
Warning: Cannot modify header information – headers already sent by (output started at /homez.145/nom-de-mon-site/www/classes/Tools.php:1) in /homez.145/nom-de-mon-site/www/classes/Cookie.php on line 252
en espérant qu’il y aura une solution^^
++ Ad
ostero
1 octobre 2009 - 11:06
Re,
J’ai changé le fichier tools.php en le remplacant par l’ancien et j’ai de nouveau accès à l’admin. C’est donc bien ce fichier qui contient une erreur, mais laquelle? aurais-je mal retranscrit le code? j’ai vérifié, il me semble que tout est ok. Si quelqu’un a une idée?
Grand merci,
Clt,
AD
Stef
28 octobre 2009 - 15:01
Bonjour,
Merci beaucoup pou ce tuto.
Par contre, je n’arrive pas à faire fonctionner Google Sitemap, j’ai remplacé le private function _postProcess() par le tien et les fichiers ne sont pas générés… J’ai bien modifié les url et les id des langues…
Une idée?
Merci
Stephen
28 octobre 2009 - 16:07
@Stef Tu es sur quelle version de Prestashop, la 1.1 ou la 1.2 ?
Stef
28 octobre 2009 - 16:33
Bonjour Stephen,
Je suis sur la Version 1.1.0.5…
Pour l’instant j’ai généré mes deux sitemaps avec Yoda maps mais cela serait plus simple avec le module…
Merci
Stephen
28 octobre 2009 - 17:21
@Stef As tu bien vérifié, comme spécifié en commentaire, les ID langue dans la fonction _postProcess() ?
Stef
28 octobre 2009 - 17:25
Oui… 2 fois pour le « fr » et 2 fois pour le « en »
J’ai également bien changer (2 fois aussi) les url mon-site et es.mon-site
J’ai remplacé ton code à la place du postProcess() et fait les modifs
Stephen
28 octobre 2009 - 18:02
@Stef c’est bizarre… C’est quoi l’erreur que tu as exactement ?
Stef
28 octobre 2009 - 18:11
Je peut accéder au module, je clique alors sur Génerer le Sitemap et la la page se recharge et seuls les menus sont encore accessibles (en fait en dessous du titre du module: « Sitemap » tout est vide). Je pensais que ce n’était qu’un petit bug et qu’il générerait tout de même les sitemaps mais rien n’est apparu à la racine ou dans le module gsitemap
J’espère avoir été clair
Stef
30 octobre 2009 - 15:06
Bonjour,
Je n’ai toujours pas réussi à régler mon problème, si qqun à une idée!
Merci
Stephen
30 octobre 2009 - 15:44
Tu as peut être déjà essayé, mais je te conseille d’essayer le script que nous avons fourni (ci dessus) qu’avec le français d’une part, et qu’avec l’autre langue d’autre part. Ainsi tu pourra savoir quelle langue génère le bug.
Si les deux fonctionnent séparément, c’est que c’est la combinaison des 2 qui bloque. Ce qui serait bizarre puisque nous utilisons ce script avec 2 langues sans problème.
Bugnet
1 novembre 2009 - 21:55
Bonjour,
Ca ne fonctionne pas avec deux domaines http://www.site.fr et http://www.site.com, dans le contexte suivant:
-Les deux domaines/sites sont heberges par lws.
-Tout mon code est sur site.com
-Depuis le panel de lws, j’ai fait un re-routage dit transparent de site.fr vers site.com
J’ai saisi les codes ci dessus, et les ai adaptes pour que site.com soit en anglais et site.fr en francais.
Dans les deux cas, le site apparait en anglais.
En debuggant, il apparait que $_SERVER['HTTP_HOST'] est toujours egale a site.com.
Le re-routage de site.fr vers site.com, fait que ce parametre prend la valeur du domaine de redirection, et non pas du nom de domaine de depart.
Pourtant, dans le champ url d’explorer, j’ai bien le nom du site de depart (site.fr). C’est le principe de la redirection transparente.
Pour que ca fonctionne, il faudrait forcer la langue par défaut selon l’URL, et non pas selon le domaine.
Seulement, je sais pas faire ! Je ne connais pas la function qui peut retourner le parametre « URL ».
Pouvez vous m’aider ?
mon site: http://www.myphotorescue.com ou .fr
Amic
Franck
Stephen
2 novembre 2009 - 10:11
@Bugnet Attention cette methode ne marche pas avec une redirection (ou reroutage) d’une url vers l’autre. La raison est simple: comme vous avez pu le constater en affichant la variable $_SERVER['HTTP_HOST'] le nom de domaine reste toujours le même. Une redirection ne fait que renvoyer un domaine vers un autre. Pour utiliser cette méthode vous devez faire pointer vos deux nom de domaine vers le même répertoire de votre serveur (celui ou est installé Prestashop). Par exemple chez Ovh il suffit de créer un alias de domaine. Chez lws je ne sais pas comment cela se passe, mais je vous conseille de vous rapprocher d’eux pour savoir comment faire.
Une fois les deux domaines orientés vers le même répertoire sur le serveur tout devrait fonctionner.
bugnet
3 novembre 2009 - 12:02
Merci Stephen pour ta reponse.
Chez lws il est en effet possible dans la page de configuration DNS, de creer des alias et egalement de changer l’IP adress d’un domaine.
Ce que j’ai fait, c’est de demander a ce que http://www.myphotorescue.net (j’ai pas voulu toucher au .fr dans un premier temps) pointe a la meme adresse IP que celle pointee par http://www.myphotorescue.com (IP de mon serveur ou se trouve mon code).
Depuis j’attend, quand je tape http://www.myphotorescue.net dasn Explorer, j’ai une page blanche avec ce message de lws « Votre demande a bien ete prise en compte, veuillez patienter 24/48h… » Ca fait 36 heures et je trouve le temps long.
Si c’est ok, je ferais de meme ave le .fr
Sinon, j’essaierai de creer un alias comme tu dis.
Je vous tiens au courant (dans 48heures :-) )
Franck
bugnet
9 novembre 2009 - 17:39
Bonjour,
Apres plus d’une semaine de bagarre avec LWS, pour tenter en vain de leur faire activer mes creation d’alias ou pointage vers l’ IP adresse du .com, leur SAV vient de finir par me dire que ce n’est pas supporté sur leur serveurs mutualises et que je dois me contenter de faire une redirection (dite transparente) de domaine.
Retour donc a la case depart. En attendant de changer d’hebergeur (lws à éviter, vraiment), , je voudrais savoir si il est possible de changer dans le code ci dessus, la variable $_SERVER['HTTP_HOST'] par une autre variable contenant le contenu du champ URL affiche a l’ecran.
En effet, avec une redirection transparente, c’est le nom de domaine saisi qui apparait dans le champs URL, et non pas le nom de domaine pointé.
Mais je ne connais pas le nom de cette variable ou la fonction html pour lire le contenu du champ URL.
Stephen, si je trouve comment faire cette modif, le reste devrait fonctionner, y compris le referencement. Exact ?
Cordialement
Franck
Stephen
10 novembre 2009 - 10:55
@bugnet Je ne sais pas si une telle variable existe (récupérer l’url en entier) ? Par contre si tu arrives à faire cela il est possible que ça marche. Sans avoir testé je ne peux pas te le garantir.
En fait dans cette méthode tout repose sur le nom de domaine (ou sous domaine).
Selon le nom de domaine par lequel on arrive sur le site on force une langue ou l’autre y compris pour les moteurs de recherche (qui ne peuvent pas stocker les cookies). La clé c’est de pouvoir différencier deux parties du site (une partie par langue) via l’url. Nous avons fait le choix du nom de domaine mais on avait aussi hésité avec des url du type: http://www.maboutique.com/en/produit-1.html ou http://www.maboutique.com/fr/produit-1.html
Si tu arrives à récupérer le « en » ou le « fr » tu pourra faire la différenciation et donc ça devrait marcher.
Mais avec des noms de domaines ou sous domaine ça parait plus simple.
robert
4 décembre 2009 - 12:32
ca marche pas bien pour les moteurs
beaucoup de beug
Stephen
4 décembre 2009 - 13:33
@robert Développez ???
robert
4 décembre 2009 - 15:19
comment générer un site map sans beug
en étant sous version Version 1.1.0.5 – 0.098s
en partagant une base de données unique
pour 2 noms de domaine differents pour 2 langues!
j ai l impression que ca bloque google..a crawler le site
dans son intégralité… dans tous les cas c est très long.
faut il ne pas utiliser l url rewriting?
Stephen
4 décembre 2009 - 16:30
@robert le tutoriel ci-dessus vous sert justement à faire tout ceci.
Bugnet
30 décembre 2009 - 18:36
Bonjour,
Je viens juste de trouver l’info que je cherchais et voulais partager avec vous (ca peut servir a d’autres).
Dans le cas ou votre hebergeur ne permet pas la creation d’alias , ni la creation de sous domaine pointant a la meme IP (cas de LWS :-(( )et seulement la redirection de domaine, la modif ci dessus peut marcher (enfin je crois, d’apres mes essais restant a confirmer) en remplacant
if($_SERVER['HTTP_HOST'] == ‘es.mon-site.com’)
par
if($_SERVER['HTTP_REFERER'] == ‘http://mon-site.es/’)
dans la modif de tools.php et configuration.php ci dessus.
En effet, cette variable retourne l’url demandee par l’internaute, avant la redirection, et non pas le nom de domaine courant.
Dans mon cas, mon domaine principal est http://www.myphotorescue.com (en)
et j’ai un domaine secondaire, http://www.myphotorescue.fr (fr), sans code, rerouté vers http://www.myphotorescue.com ou se trouve tout le code.
La commande ci dessous me permet de detecter l’url avant la redirection et donc de passer le site en francais si on arrive du .fr
Ca marche pour la gestion de la langue, cote utilisateur. Mais comment verifier que les moteurs de recherche indexent bien les deux langues à present?
Me reste plus que la partie double sitemap a faire…
Franck
Bugnet
30 décembre 2009 - 20:06
Hi,
The new script to generate the sitemap files is not working on my site, I got the following error message when it executes this line:
$xml = new SimpleXMLElement( »);
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : AttValue: » or ‘ expected in /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php on line 198
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: in /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php on line 198
…/…
Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php on line 198
Fatal error: Uncaught exception ‘Exception’ with message ‘String could not be parsed as XML’ in /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php:198 Stack trace: #0 /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php(198): SimpleXMLElement->__construct(‘_postProcess() #2 /var/www/myphotorescue.com/htdocs/partie-admin/tabs/AdminModules.php(118): Gsitemap->getContent() #3 /var/www/myphotorescue.com/htdocs/partie-admin/index.php(63): AdminModules->postProcess() #4 {main} thrown in /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php on line 198
Any clue ?
Franck
Bugnet
30 décembre 2009 - 20:28
I reply to myself. The syntax " simply need to be replaced by the » caracter in the gsitemap.php script above.
Now, get another set of errors at execution:
Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php on line 255
Warning: fclose(): supplied argument is not a valid stream resource in /var/www/myphotorescue.com/htdocs/modules/gsitemap/gsitemap.php on line 256
generated by those lines:
254 $xmlString = $xml->asXML();
255 fwrite($fp, $xmlString, Tools::strlen($xmlString));
256 fclose($fp)
Franck
Bugnet
30 décembre 2009 - 21:20
Re-bonsoir. J’espere ne pas trop polluer le post avec mes interventions et questions a repetition.
Et desollé egalement pour les deux post precedent en anglais, j’ai pas fait attention et l’habitude du boulot a pris le dessus.
Tout ca pour dire, que voila, ca marche a present, a qlq details pres.
Ce que j’ai trouve qui marchait pas:
-comme ecrit plus haut, utiliser $_SERVER['HTTP_REFERER'] pour lire le nom de l’url saisie avant une redirection de domaine.
-la chaine de caracteres & q u o t ; est remplacer par un simple guillemet dans le code de gsitemap ci dessus
-et enfin, pour resoudre les erreur de fwrite() mentionneées ci dessus, j’ai du remplacer dans le meme code
$fp = fopen($this->_filename, ‘w’);
par $fp = fopen(GSITEMAP_FILE, ‘w’);
et
$res_fr = file_exists($this->_filename_es);
par
$res_fr = file_exists(GSITEMAP_ES_FILE);
egalement
$res = file_exists($this->_filename);
par
$res = file_exists(GSITEMAP_FILE);
et dupliquer la ligne define suivante:
define(‘GSITEMAP_FILE’, dirname(__FILE__).’/../../sitemap.xml’);
par
define(‘GSITEMAP_FR_FILE’, dirname(__FILE__).’/../../sitemap_fr.xml’);
Egalement
file_put_contents(GSITEMAP_FILE, »);
avec
file_put_contents(GSITEMAP_FR_FILE, »);
meme chose pour la fonction function _postValidation()
J’espere etre clair. Sinon, si qcq peut m’expliquer comment joindre un copier colle de mon code complet, je le ferai avec plaisir.
Reste d’autres soucis a regler, comme par exemple le fait que le fichier sitemap anglais genere est beaucoup plus grand que le site map francais qui semble incomplet (alors que toute les traductions sont faites). Mais c’est un probleme lie a la re-ecriture des URL je pense, qui n’a rien a voir avec ce post.
Je vais de ce pas charge ces deux sitemaps chez google et attendre pour voir ce que ca donne…
Merci
Franck
bichap
4 janvier 2010 - 19:56
oui tout ca est bien beau mais avec 2 domaines, pour les 2 langues on partagent les memes photos, nous avons un beau beaug le spider
voit les lienst des images du domaine fr sur le site uk!!
quelle galère!
michel
5 janvier 2010 - 1:41
bonsoir
mon site map ne généère pas mes nouvelles pages, ni catégories
dans l administration il voit bien 250 pages,
mais aucune mise à jour du site map en.xm?
quelqu un peut nous aider avant de migrer!!
Fabrice
9 janvier 2010 - 0:00
Bonjour !
j’apprends (avec surprise) que ma version US n’est pas référencée par google… j’étais loin d’imaginer que google ne savait pas référencer si ça passait par un cookie. c’est effectivement une « erreur » de conception à la base ce problème. bon, passons…
cette méthode fonctionne-t-elle avec une version 1.2.5 ?
quelqu’un a-t-il déjà fait cette manip ?
merci pour vos infos,
et bonne année à tous !
Fabrice
Stephen
11 janvier 2010 - 9:25
@Fabrice Nous n’avons pas testé avec la version 1.2.5 mais a priori je pense que ça devrait marcher. A tester après avoir fait des sauvegardes complètes :-)
lehangart
22 janvier 2010 - 19:52
Bonjour,
J’ai essayé la modif du fichier tools.php mais j’ai l’impression que ça ne force pas la langue..
Je ne sais pas ou doit s’arreter la modification; est ce que c’est tout le bloc /* Automatically detect language if not already defined */ qu’il faut remplacer par le code modifié ou qu’une partie?
lehangart
26 janvier 2010 - 15:52
Merci pour tout…
Ça fonctionne très bien!
Pour ceux qui se retrouve avec une page blanche aprés la modif du fichier tools.php il suffit de fermer le code avec }
Yann
8 mars 2010 - 10:51
Bonjour,
je vais bientôt devoir mettre en place un site d’ecommerce en trois langues avec prestashop, j’ai quelques questions avant de me lancer :
-la manipulation fonctionne toujours avec la 1.2.5?
-pour le deuxième morceau de code, à propos de la mise en place du multilangage dans l’admin, c’est bien pour avoir accès aux différentes langues en backoffice? Parce que c’est pas ce que j’ai l’intention de faire, je souhaite disposer de 3 langues pour le visiteur et seulement du français pour le gérant du site. Si je ne met pas en place cette partie, tout le reste va fonctionner?
Merci d’avance
Bibichette
12 mars 2010 - 11:08
Bonjour,
ca semble fonctionner pour la version 1.3.0.3 aprés quelques modifs.
Je n’ai pas testé la partie sitemap pour l’instant.
Le fonctionnement choisi est le suivant. Le domaine principal est http://www.domain.tld
domain.tld est réglé dans un fichier de config comme ça on peut facilement modifier pour tester en local et en production.
Le language par défaut est le français. pour chaque langue on a un site du style de.domain.tld pour l’allemenage, es.domain.tld
Pour mes besoins particuliers j’ai ajouté ça dans le fichier config/settings.inc.php
... define('_DOMAIN_NAME_', 'domain.local'); // ma-boutique.com ou ma-boutique.eu define('_PS_LOGGING_FILE_', 'prestashop.log'); // nom du fichier de log, pour tracer l'activité define('_PS_LOGGING_', 1); // activer le log ou pas ?>dans Tools.php, pour pouvoir debbugger plus facilement en affichement des messages dans un fichier prestashop.log
static public function logLine($message, $level='DEBUG',$file=_PS_LOGGING_FILE_){ if (_PS_LOGGING_ == 1){ $line = $message; $line = '['.date("d/m/Y H:i:s").']['.$level.'] '.$line."\n"; file_put_contents($file, $line, FILE_APPEND); } }dans Tools::setCookieLanguage()
... Tools::logLine('setCookieLanguage'); if(ereg('admine', $_SERVER['REQUEST_URI'])) $admin = 1; /* Automatically detect language if not already defined */ if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND ($admin!=1)) { $array = explode(',', self::strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); $domain = _DOMAIN_NAME_; if($_SERVER['HTTP_HOST'] == 'www.'.$domain){ $array[0] = 'fr'; } else { $array[0] = substr($_SERVER['HTTP_HOST'],0,2); } Tools::logLine('[setCookieLanguage] host:'.$_SERVER['HTTP_HOST'].' | iso:'.$array[0]); // la suite est la même if (self::strlen($array[0]) > 2) { $tab = explode('-', $array[0]); $string = $tab[0]; } ...dans Tools::switchLanguage()
On redirige sur le bon site en fonction de la langue choisie, si on ne se trouve pas déjà sur le bon site.
static public function switchLanguage() { global $cookie; Tools::logLine('switchLanguage'); if ($id_lang = intval(self::getValue('id_lang')) AND Validate::isUnsignedId($id_lang)){ $cookie->id_lang = $id_lang; // Modification if(!ereg('admine', $_SERVER['REQUEST_URI'])){ // on redirige sur le bon domaine si on est pas dans l'admin $iso = Language::getIsoById(intval($cookie->id_lang)); $domain = _DOMAIN_NAME_; // on verifie si on est sur le bon domaine if ($iso == 'fr' AND $_SERVER['HTTP_HOST'] != 'www.'.$domain){ $newDomain = 'www.'.$domain; }else if ($iso != 'fr' AND $_SERVER['HTTP_HOST'] != $iso.'.'.$domain){ $newDomain = $iso.'.'.$domain; }else{ $newDomain = ''; } if ($newDomain != ''){ //$redirect = ; Tools::logLine('[switchLanguage] iso:'.$iso.' | redirect: http://'.$newDomain.$_SERVER['REQUEST_URI']); Tools::redirect($_SERVER['REQUEST_URI'], 'http://'.$newDomain); } } } }dans Configuration::get()
Je ne sais pas vraiment comment tester ce code, mais la modif d’origine je ne vois vraiment pas comment ça fonctionnait.
static public function get($key, $id_lang = NULL) { if (!is_array(self::$_CONF) OR !is_array(self::$_CONF_LANG) OR !Validate::isConfigName($key)) die(Tools::displayError()); // AJOUT // on sélectione la langue en fonction du nom de domaine if (NULL == $id_lang){ if($_SERVER['HTTP_HOST'] != 'www.'.$domain){ // recupere le code iso en fonction de l'host $iso = substr($_SERVER['HTTP_HOST'],0,2); if (Validate::isLanguageIsoCode($iso)){ $lang = new Language(intval(Language::getIdByIso($iso))); if (Validate::isLoadedObject($lang) AND $lang->active){ $id_lang = intval($lang->id); Tools::logLine('[Configuration::get] host: '.$_SERVER['HTTP_HOST'].' | iso: '.$iso.' | id_lang:'.$id_lang); } } } } // FIN AJOUT if ($id_lang) { if (key_exists(intval($id_lang), self::$_CONF_LANG) AND key_exists($key, self::$_CONF_LANG[intval($id_lang)])) return self::$_CONF_LANG[intval($id_lang)][$key]; } elseif (key_exists($key, self::$_CONF)) { return self::$_CONF[$key]; } ...Voili voila. Je ne suis pas encore certain de l’efficacité de ces modifs. je débute avec prestashop et pour moi le php c’est pas vraiment ça. donc à tester.
lehangart
24 mars 2010 - 11:08
Bonjour,
Juste un petit mot pour dire que je suis passé à la version 1.2.5 de prestashop…
J’ai donc effectué et testé la même méthode et à priori ça marche!
En tout cas je n »ai pas encore trouvé de bug.
rololo88
8 avril 2010 - 3:11
Bonjour,
Je suis tres tres interesser par votre article ayant moi meme
la version 1.1.0.5 de prestashop j’ai donc essayer apres avoir creer mon sous domaine pour le langue anglaise mais la modification sur le fichier tools.php plante mon site web, la page est blanche est ne charge pas. Doit ont ajouter le code a partir de la ligne 112 ou remplacer une partie du code par le votre j’avoue que les deux
solutions on donner le meme resultat.
MErci pour votre aide.
Stephen
8 avril 2010 - 8:45
@rololo88 A mon avis vous avez un quote mal fermé ou mal interprété. Normalement il faut modifier, le code que je fourni, sur votre fichier Tools.php.
Si vous avez fait copier/coller du code je vous conseille de refaire l’opération en recopiant le code à la main.
lehangart
9 avril 2010 - 15:47
@rololo88 J’avais aussi ce pb et en ce qui me concerne il manquait un } à la fin du code…
En effet si tu les comptes il en manque bien un pour qu’ils soient tous refermés!
Stephen
9 avril 2010 - 16:07
@lehangart Quel oeil de lynx :-)
Effectivement il manquait un }
J’ai modifié le code pour pas que d’autres aient le même problème.
Merci de ta contribution.
lehangart
15 avril 2010 - 14:22
@stephen Très modeste contribution par rapport au code dévellopé!
J’ai un petit soucis avec la génération du sitmap; En effet, le code génère bien un sitmap correct mais seulement pour la première langue. Je suis arrivé en modifiant le code à généré un site map pour la 2émée langue mais pas les 2 en même temps… Aurais tu une solution?
PS: En ce qui me concerne il faut enlever dans le code le nom de domaine qui fait doublon avec la fonction $link->getProductLink; Du coup on se retrouve avec des url du type: monnomdedomaine.commonnomdedomaine.com/……
rololo88
14 mai 2010 - 5:19
@lehangart
Tu pourrais développer stp car je suis dans une impasse aussi
avec le sitemap, j’ai le même souci que steff voir ci dessous,
« Je peut accéder au module, je clique alors sur Génerer le Sitemap et la la page se recharge et seuls les menus sont encore accessibles (en fait en dessous du titre du module: « Sitemap » tout est vide). Je pensais que ce n’était qu’un petit bug et qu’il générerait tout de même les sitemaps mais rien n’est apparu à la racine ou dans le module gsitemap »
Merci pour ce tuto super utile!
iboMonkey
19 juin 2010 - 15:19
Hi there,
First excuse me for posting in English, my level of French is just too low.
This seems to be a really awesome modification, I just can’t get it to work (I’m using PS 1.2.5)
I’ve tried to modify the files with the code but, as lehangart and rololo88, I get blank pages after modifying the tools.php. I’ve also put in the } at the end of the code etc. My ISO-codes and language id’s in all the files are checked and ok. So I figured, maybe I should not just put in the code into the file, but maybe take away some of the original code as well? Could anyone give me an idea of how to get it working properly?
Thanks in advance,
ibo
Julien Breux
8 juillet 2010 - 14:35
Je suis entrain de mettre en place une MAJ pour la version 1.3.x et 1.4.x.
Rendez-vous très bientôt !
Stephen
8 juillet 2010 - 15:11
Trés intéressant ! N’hésite pas à nous prévenir lorsque ta mise à jour sera en place !
Cédric
11 août 2010 - 10:37
Salut Stephen
Au niveau des modules de paiement CB, tu as géré ça comment ? Car la banque n’accepte qu’un seul sous-domaine et… là je suis en train de modifier une boutique existante pour du bilingue, et j’ai bien peur que le module CB ne fonctionne pas !!!
Non ?
Stephen
11 août 2010 - 21:40
@Cédric Salut, pour ma part la seule fois ou j’ai utilisé cette méthode il n’y avait qu’un paiement Paypal sur le site et cela a marché sans encombre.
C’est sur que cela risque de te poser un problème. Normalement ta banque n’a besoin que d’une URL de retour boutique. Peut être que n’importe quel domaine peut marcher. Sinon tu as toujours la solution de passer par l’intermédiaire de Paybox qui normalement marche nickel avec cette méthode. Paybox n’est en fait qu’un intermédiaire entre toi et ta banque. Ils prennent une com mais c’est raisonnable.
Cédric
12 août 2010 - 11:51
Bonjour
En fait je bosse pour un client et je doute (très fortement) qu’il accepte de perdre une partie de sa marge ;-)
Je vais donc voir pour arranger le coup (détecter des pages ou un truc du genre, avec gestion du cookie de langue idoine : une belle prise de tête en perspective !)
Je te tiendrai au courant ! En fait je vais commencer par… tester sans rien faire (j’ai peu d’espoir mais sait-on jamais lol)
Cédric
17 août 2010 - 17:11
Petit up, juste pour dire que je ne peux même pas mettre un article dans le panier sur la partie UK :-(
Il faut donc que je gère en temps réel toutes les pages de panier / paiement sur le « www » (que de la joie en perspective)
Stephen
17 août 2010 - 18:19
Salut Cédric. Je ne comprend pas pourquoi tu ne peux pas mettre les articles dans le panier UK. C’est par rapport à ta banque ?
Cédric
18 août 2010 - 9:20
Je ne sais pas, en tout cas ça ne fonctionne pas…
Ce n’est pas lié à la banque, je ne crois pas. Je vais désactiver le contrôle temps réel des URL pour voir…
Cédric
18 août 2010 - 9:48
Zut, ça fonctionne :-x
Je viens de tester sous FF (je vais retester sous Chrome car hier j’étais sous Chrome)
Edit : fonctionne sur tous les navigateurs sauf Chrome ???
Bon, ça restera comme ça pour le moment…
Cédric
19 août 2010 - 13:26
Re UP !
Apparemment le paiement fonctionne sans trop de problèmes (et sans modifs ce qui est très étonnant !)
Par contre j’étais logué sur un compte existant, je ferai de nouveaux tests sur un compte nouveau. Mais je ne sais pas ce qui se passe sous Chrome (sous IE ça fonctionne bien)
Stephen
19 août 2010 - 13:50
Si ça peut t’aider, normalement le système de panier et de commande n’est pas impacté par le navigateur. Je dis bien normalement… ;-)
Laisser un commentaire