[Résolu] Session langage switcher & user anonymes

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

j'ai créé un site multilingue anglais/français.
En suivant un tuto, j'ai tout bien fait et le site est fonctionnel.

N'ayant pas différents noms de domaines (genre .fr pour français et .com pour anglais) j'ai choisi la méthode de sélection par session. Sur un première page (hors drupal) l'utilisateur choisi sa langue et est ainsi redirigé vers www.monsite.com/site/?lang=fr pour le français et www.monsite.com/site/?lang=en pour l'anglais.

Tout marchait très bien jusqu’à ce que je me rende compte que cela ne marche pas avec les utilisateurs anonymes.
en effet, une fois déconnecté, en choisissant la langue anglais (la langue par défaut est le français) j'arrive sur la page www.monsite.com/site/?lang=en qui s'affiche bien en anglais.
mais de la, si je clique sur un lien quelconque, je perds le paramètre ?lang=en dans l'url, et là le site re-bascule en français. Chose que ne se produit pas en étant connecté...

en fouillant sur pas mal de forums, je fini par trouver ce topic : http://drupal.org/node/815526

j'y trouve un patch, et là, je me rends compte que ce patch (qui par ailleurs est déjà appliqué dans ma version de D7 installée) fait exactement l'inverse de ce que je cherche : il empêche l'utilisation de la session langage pour les anonymes !

Index: includes/locale.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/locale.inc,v
retrieving revision 1.255
diff -u -p -r1.255 locale.inc
--- includes/locale.inc  24 May 2010 07:22:12 -0000  1.255
+++ includes/locale.inc   3 Jun 2010 13:16:22 -0000
@@ -126,9 +126,14 @@ function locale_language_from_user($lang
function locale_language_from_session($languages) {
   $param = variable_get('locale_language_negotiation_session_param', 'language');

-  // Request parameter.
+  // Request parameter: we need to update the session parameter only if we have
+  // an authenticated user.
   if (isset($_GET[$param]) && isset($languages[$langcode = $_GET[$param]])) {
-    return $_SESSION[$param] = $langcode;
+    global $user;
+    if ($user->uid) {
+      $_SESSION[$param] = $langcode;
+    }
+    return $langcode;
   }

   // Session parameter.

j'ai donc appliqué ce patch a l'envers, et j'obtiens bien le résultat souhaité.

Maintenant, si je poste ce sujet, c'est pour poser la question suivante :
pourquoi cette fonctionnalité pour les utilisateurs anonymes a-t-elle été désactivée ?

plusieurs commentaires sur la même page du forum insistent sur le fait que c'est une mauvaise idée d'utiliser cette méthode...
Otherwise, the fix is ok. And just proves that the session language switcher is really a bad idea.
People need to understand that serving different content at the same URL is just a bad idea

quelqu'un peut-il m'éclairer sur pourquoi cette méthode serait une mauvaise idée, et si le fait que j'ai appliqué le patch a l'envers n'est pas une erreur touchant à la sécurité par exemple ?

merci d'avance!

Version de Drupal : 

Bonjour,

Déjà, pourquoi n'utilises-tu pas les url raccourcies ? C'est quand même beaucoup plus propre que ?lang=.
Ensuite, je n'ai jamais eu ce type d'erreurs. Mais j'aurais bien du mal à te répondre sans voir comment tu as fait. Tu peux me montrer le tutoriel que tu as suivi ?
S'il y a une différence entre anonymes et logués, n'y-a-t-il pas des choses à changer dans les permissions données aux anonymes ?

Bref, je t'avoue que répondre comme ça, du tac au tac, risque d'être difficile. Il y a sûrement 1000 possibilités.

Bonjour, et merci de ta réponse.

j'ai suivi ce tutorial en deux parties : http://www.youtube.com/watch?v=tQSJjNz8c7w

j'ai juste changé de mode de sélection, car dans le tuto il utilise la détection par nom de domaine, or, je n'ai pas différents nom de domaines pour mon site.
j'ai donc choisi la méthode de sélection par session, qu'il faut utiliser en utilisant le paramètre ?lang=fr ou ?lang=en en fonction des besoins...

pour les url raccourcies, je viens d'essayer, enfin... tu parles des alias d'url ou des url simplifiées ?

pasque les alias d'url, c’est pas possible a créer : quand je met : ?lang=fr ou index.php?lang=fr, ça me met une erreur : Le chemin 'index.php?lang=fr' est invalide ou vous n'êtes pas autorisé à y accéder.

et les url simplifiées permettent de : "Utiliser des URL de la forme example.com/user à la place de example.com/?q=user."

sauf que ici, je n'utilise pas la variable "q" mais la variable "lang", donc ça ne fonctionne pas non plus.

Quant aux autorisations, j'ai bien cherché partout, mais le pb ne vient pas de là, il vient bien de la partie de code dont je parle dans mon premier message...

Oui, je voulais parler des url simplifiées, me suis trompé dans le terme francophone.

Les URL seront comme ça :
site.com/fr/page
site.com/en/page

Tu pourras voir un exemple sur une de mes références :
http://www.ensta-paristech.fr/ (en cliquant sur les drapeaux en haut à droite)

Dans
admin/config/regional/language/configure
Il faut mettre URL en premier. Comme ça, pas besoin de session (et c'est mieux pour avoir toutes les pages bien référencées dans Google). Dans "configurer" à droite, il faut choisir "préfixe de chemin" à la place de nom de domaine.

Pas besoin de patch pour gérer les langues, Drupal 7 fonctionne très bien sans. :)