2010-03-16 6 views
4

Je voudrais changer ceci:Comment simplifier cette déclaration de commutateur php?

// use appropiate lang.xx.php file according to the value of the $lang 
switch ($_SESSION['lang']) { 
case 'en': 
$lang_file = 'lang.en.php'; 
break; 

case 'es': 
$lang_file = 'lang.es.php'; 
break; 

case 'zh-tw': 
$lang_file = 'lang.zh-tw.php'; 
break; 

case 'zh-cn': 
$lang_file = 'lang.zh-cn.php'; 
break; 

default: 
$lang_file = 'lang.en.php'; 
} 

en quelque chose comme ceci:

//include file for final output 
include_once 'languages/lang.'.$_SESSION['lang'].'php; 

(je pense que la variable $lang_file devient redondante si je fais l'inclure-sortie-finale chose ci-dessus)

Pour que je puisse passer la partie entière switch. J'ai essayé d'autres combinaisons mais elles ne semblent pas fonctionner. Aucune suggestion?

Répondre

17

Vous pouvez le faire:

switch ($_SESSION['lang']) { 
case 'en': 
case 'es': 
case 'zh-tw': 
case 'zh-cn': 
    $lang_file = 'lang.'.$_SESSION['lang'].'.php'; 
    break; 

default: 
    $lang_file = 'lang.en.php'; 
} 

Ou utiliser un tableau et utiliser in_array pour voir si la valeur est dans le tableau:

$languages = array('en', 'es', 'zh-tw', 'zh-cn'); 
if (in_array($_SESSION['lang'], $languages)) { 
    $lang_file = 'lang.'.$_SESSION['lang'].'.php'; 
} else { 
    $lang_file = 'lang.en.php'; 
} 

Vous même pouvez omettre en dans les deux cas depuis c'est le défaut.

+0

@Gumbo Excellente réponse. Mais j'ai une question: est-il possible d'inclure le fichier directement sans utiliser la variable $ lang_file quelque chose comme ça n'est pas sûr: include_once 'languages ​​/ lang.'. $ _ SESSION ['lang']. 'Php; – alexchenco

+0

@janoChen: Il est possible de le faire de cette façon. Mais vous devriez prendre le cas que '$ _SESSION ['lang']' n'est pas défini ou ne contient pas une valeur valide. Ensuite, vous obtiendrez juste 'languages ​​/ lang..php'. Mais si vous vous assurez que $ _SESSION ['lang'] 'existe toujours et a une valeur valide, vous pouvez le faire de cette façon. – Gumbo

2
$lang_file = 'lang.' . ($_SESSION['lang']) . 'php'; 
if(!file_exists($lang_file)) 
{ 
    $lang_file = 'lang.en.php'; 
} 

bien qu'il ne soit pas sécurisé contre les injections. Il vous permet cependant d'ajouter de nouveaux codes de langue sans modifier le code.

+0

Je pense qu'il serait difficile d'injecter quelque chose dans la variable $ _SESSION. La variable de session n'est jamais accessible par le client, elle est simplement connectée au client via un cookie. Cependant, la variable $ _COOKIE est accessible en écriture au client via des en-têtes HTTP. – joar

2

Ou:


$allowed = array('en', 'es', 'zh-tw', 'zh-cn'); 
$lang_file = (in_array($_SESSION['lang'], $allowed)) 
      ? 'lang.'.$_SESSION['lang'].'.php' : 'lang.en.php'; 
0

Cela Avec cela, fonctionnera parfaitement

$lang_file_tmp = 'lang.' . $_SESSION['lang'] . '.php'; 
if (preg_match('/^[a-zA-Z\-]{2,5}$/', $_SERSSION['lang']) && file_exists($lang_file_tmp)) { 
    $lang_file = $lang_file_tmp; 
} else { 
    $lang_file = 'lang.en.php'; 
} 

vous ne devez modifier le code à chaque fois que l'ajout d'une nouvelle Vous êtes en train de langue et vous ne avoir à se soucier de la sécurité.

+0

Je peux voir ce que vous essayez de faire, mais je ne pense pas que votre code soit correct. Votre instruction if devrait probablement être 'if (preg_match (...) && file_exists (...)) {'. Aussi, je ne vois pas le point de '$ lang_file_tmp' –

+0

Vous avez raison, j'ai modifié mon post pour refléter vos changements. $ lang_file_tmp est là pour supprimer le besoin de taper la séquence de concaténation plus d'une fois. – joar

Questions connexes