Test de require

Ce topic a été résolu
TheFlameflo

TheFlameflo Le 24 avril 2016 à 16:53 (Édité le 25 janvier 2019 à 17:50)

Bonjour,
J'ai créé un petit système me permettant de gérer plusieurs langue sur mon site.
En fait, grâce à un GET['lang'], je choisis la langue.
Mais, si j'ai plusieurs dizaines de langues, comment faire en sorte que ça s'éxécute sans une condition pour chaque langue?
Voici mon code :
#Lang settings
if(isset($_GET['lang']))
{
   if($_GET['lang'] == 'en')
   {
      require('lang/'. $_GET['lang'] . '.php');
   }
   elseif($_GET['lang'] == 'fr')
   {
      require('lang/'. $_GET['lang'] . '.php');
   }
   else{
      require('lang/en.php');
   }
}
else
{
   require('lang/en.php');
}
J'aimerais trouver un moyen de faire ceci :
1. Je teste s'il y a une donnée, sinon, la langue par défaut est anglais.
2. Je teste si un require marche. Comme par exemple si : require('lang/'. $_GET['lang'] . '.php') retourne un fichier ou rien.
3. Si ça retourne quelque chose, la langue en question est choisie, sinon, on met anglais.
Mais voilà le problème, je n'ai aucune idée pour savoir si un require marche ou pas, comment on le sait grâce à une condition.

J'ai essayé ce petit code, mais rien : 
if(isset($_GET['lang']))
{
   
   if(file_exists('lang/' . $_GET['lang'] . '.php'))
   {
      require('lang/' . $_GET['lang'] . '.php');
   }
   else
   {
      require('lang/en.php');
   }
}
else
{
   require('lang/en.php');
}
Pouvez-vous m'éclairer ?

Merci d'avance! ^^

PS : Si je n'ai pas été clair, n'hésitez pas à me poser des questions !
Wistaro

Wistaro Le 24 avril 2016 à 17:11 (Édité le 24 avril 2016 à 17:12)

Salut, 

Tu dis qu'il ne fait rien...Il t'affiche que la langue anglaise?

Perso, j'aurais pas utilisé un file_exists(), c'est assez lourd. En plus, si les permissions du répertoires sont mal configurées, ça peux ne pas marcher (c'est peut-être ça le problème ici?)

En tout cas, je préfère utiliser un test sur un tableau ici: 
J'aurais fait:
$lang = array('fr','en','gl','mc','xx','xx','xx'); //tableau de tout tes préfixes de langue
if(isset($_GET['lang'])){
         
   $lang_get = htmlspecialchars($_GET['lang']); //sécurise le get
   if(in_array($lang_get,$lang))   {
      require('lang/' . $lang_get . '.php');
   }
   else   {
      require('lang/en.php');   }
}else{
    require('lang/en.php');
}

Aendawan

Aendawan Le 24 avril 2016 à 17:17

pour ma part, je fais ça pour enjoyfiles.com

<?php
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
    $navigatorLanguage = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    $navigatorLanguage = strtolower(substr(chop($navigatorLanguage[0]),0,2));
}
else
    $navigatorLanguage = 'en';

// détection de la langue
$lang_agree = array('french', 'english');
if(!empty($_COOKIE['language']) && in_array($_COOKIE['language'], $lang_agree))
{
    $user_lang = $_COOKIE['language'];
}
else{
    if($navigatorLanguage == "fr"){
        $user_lang = 'french';
    }
    elseif($navigatorLanguage == "en"){
        $user_lang = 'english';
    }
    else{
        $user_lang = 'english';
    }
}
// fin détection de la langue

$config['language']    = $user_lang;
?>
Ensuite, j'ai mes fichiers "french", "english", "german" etc ... Je stocke $user_lang dans ma variable config, mais tu peux le mettre dans une constante. Tu met ça dans ton fichier de configuration. Ensuite, quand tu as besoin d'un fichier de traduction, tu fais

<?php require_once('language/'.USER_LANG.'/nom_du_fichier.php'); ?>
TheFlameflo

TheFlameflo Le 24 avril 2016 à 17:37

Salut !
Merci à vous deux, je vais tester vos techniques ! 😀
Sujet résolu ! 😀
Aendawan

Aendawan Le 24 avril 2016 à 17:42

De rien, c'est un plaisir 😉
Wistaro

Wistaro Le 24 avril 2016 à 17:52

Cool! 
TheFlameflo

TheFlameflo Le 25 avril 2016 à 15:05

Salut !
J'ai un petit problème par rapport à ça, pour éviter de réouvrir un sujet, je vais poser la question ici :
J'ai modifié le code de Wistaro pour l'adapter avec les cookies, la langue du navigateur et le GET.
Mais, je recois des erreurs pour toutes les constantes :

Notice: Undefined index: lang in C:\wamp\www\SpecificationsManager\inc\config.php on line 32

Notice: Constant REGISTER already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 2

Notice: Constant INDEX already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 3

Notice: Constant NAME already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 4

Notice: Constant MAIL already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 5

Notice: Constant MAIL_CONF already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 6

Notice: Constant PASSWORD already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 7

Notice: Constant PASSWORD_CONF already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 8

Notice: Constant SIGN_UP already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 9

Notice: Constant SIGN_IN already defined in C:\wamp\www\SpecificationsManager\inc\lang\fr.php on line 10
Voilà ce que j'ai quand j'essaye de changer de langue.
C'est comme si les deux fichiers de langues sont chargés en même temps.
Je vous laisse mon code, merci d'avance ! 😀
   $lang = array('fr', 'en');
   $lang_coo = htmlspecialchars($_COOKIE['lang']);
   $lang_nav = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); 
   if(isset($_GET['lang'])){ 
      $lang_get = htmlspecialchars($_GET['lang']);
      if(in_array($lang_get, $lang))
      {
         unset($_COOKIE['lang']);
         require('lang/' . $lang_get . '.php');
         setcookie('lang', $lang_get, time() + 365*24*3600);
      }
   }
   if(in_array($_COOKIE['lang'], $lang))
   {
      require('lang/' . $lang_coo . '.php');
   }
   elseif(in_array($lang_nav, $lang))
   {
      unset($_COOKIE['lang']);
      require('lang/' . $lang_nav . '.php');
      setcookie('lang', $lang_nav, time() + 365*24*3600);
   }
   else
   {
      require('lang/en.php');
   }
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte