Bonjour tout le monde,
Je suis en train d'internationaliser un site en utilisant la méthode la plus simple, et voilà que je rencontre un petit problème au niveau du menu de changement de langue.
J’ai un menu qui contient 3 drapeaux et un tableau qui contient les langues autorisées.
Le problème se produit lorsque l’utilisateur tape une valeur inexistante dans l’url comme par exemple : www.exemple.org/index.php?lang=Xgdhyjguf (le menu disparaît bien évidemment).
Ce que je veux :
Si l’utilisateur tape une telle valeur , rester sur la même page et ne faire aucun changement (ou s'il existe d'autres solutions..).
Mon code actuel :

<?php
$authorized_languages = ['fr', 'en', 'ru'];
if (!empty($_GET['lang']) && in_array($_GET['lang'], $authorized_languages)) {
   require_once 'lang/'.$_GET['lang'].'.php';
} else {
   if(empty($_GET['lang'])) {   
      require_once 'lang/fr.php';
   } 
}

merci d'avance pour votre aide.

5 réponses


SLK
Réponse acceptée

Salut,

je ne suis pas sur d'avoir compris,
mais je crois que c'est parcequ'il te manque le cas : "NOT empty && NOT in_array"

Ce que tu peux faire c'est :

En base de données, tu rajoutes un champ 'lang', dans ta table qui stock les utilisateurs.
Quand un utilisateur créer un compte, tu lui met la valeur 'fr' par défaut (ou tu lui demande quelle langue il préfère, dans le formulaire d'inscription).

Quand un utilisateur connecté, clic sur un drapeau de changement de langue :

  • tu lui stock cette langue en base de données.
  • et tu la stock aussi en session

Quand un utilisateur NON connecté clic sur un drapeau de changement de langue :

  • tu la stock en session

Quand un utilisateur se connecte :

  • tu mets en session sa valeur de 'lang' qui est enrégistrée en base de données.

Du coup si on reprend ton code, un truc du style :

<?php
$authorized_languages = ['fr', 'en', 'ru'];

if (!empty($_GET['lang']) && in_array($_GET['lang'], $authorized_languages)) {
    $lang = $_GET['lang'];
else {
    $lang = $_SESSION['lang'] ?? 'fr';
}

require_once 'lang/'. $lang . '.php';
kraster
Auteur

Merci de vos réponses,
jimibi, j'ai utilisé le mode strict ça ne change rien, et dans le HTML j'utilise un menu au survol Bootstrap.
SLK, votre code est élegant je vais l'étudier, mais comme vous l'avez dit le cas manquant ("NOT empty && NOT in_array") , j'ai essayé de résoudre ce cas et je ne trouve pas tjs la solution, j'ai fait la condition mais le resultat sera quoi !??
je ne veux pas faire de redirection vers la page d'acceuil par exemple.

Mince, excuse-moi je n'ai pas compris le problème.

Pourquoi est-ce qu'on parle de redirection ?

Je te conseille d'enlever le if dans le else et de par defaut mettre le site en français.

$lang = strtolower($_GET['lang'] ?? 'fr'); // PHP7
$lang = !empty($_GET['lang']) ? strtolower($_GET['lang']) : 'fr'; // PHP 5
$authorized_languages = ['fr', 'en', 'ru'];
if (in_array($lang, $authorized_languages)) {
    require_once 'lang/'.$lang.'.php';
} else {
    require_once 'lang/fr.php';
}
kraster
Auteur

Les amis je vous remercie tous pour votre aide.
Je vais expliquer le problème:
J’utilise un menu au survol Bootstrap pour changer la langue. donc l'utilisateur peut changer la langue du site en cliquant sur le menu ou bien directement par la méthode GET en tapant "?lang=fr, en ou ru" dans l'URL.
Si la langue française est sélectionnée: le site doit s'afficher en français et le drapeau de français doit apparaitre dans le menu et ainsi de suite.
Si l'utilisateur modifie l'URL les problèmes arrivent:
1- En supprimant "?lang=" de l'URL le menu affiche la langue par défaut (français) mais le site reste sur la même langue avant la suppression.
2- En tapant une langue inexistante "?lang=it" ou par exemple un truck du genre "?lang=dfgfgfg" le site doit rester sur la même page et aucun changement ne doit s'effectuer.
J'ai résolu le problème comme ça:
j'ai créé un fichier localisation .php

$authorized_languages = ['fr', 'ru', 'en'];
if(!empty($_GET['lang']) && in_array($_GET['lang'], $authorized_languages)) {
    $_SESSION['locale'] = $_GET['lang'];
} else {
    if(empty($_GET['lang'])) {
        $_SESSION['locale'] = $authorized_languages[0];
    }
}

et dans la page index.php

require_once 'inc/localization.php';

. . .
// là ou il y a le menu
if(!empty($_SESSION['locale']) && in_array($_SESSION['locale'], $authorized_languages)) {
   require_once 'lang/' . $_SESSION['locale'] . '.php';
} else {
   require_once 'lang/fr.php';
}

Encore une fois merci à vous tous.