tags:

views:

315

answers:

4

I would like to change this:

// 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';
}

into something like this:

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

(I think the $lang_file variable becomes redundant if I do the include-final-output-thing above)

So that I can skip the whole switch part. I tried other combinations but they don't seem to work. Any suggestions?

+17  A: 

You can do this:

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';
}

Or you use an array and use in_array to see if the value is in the array:

$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';
}

You even could omit en in both cases since it’s the default.

Gumbo
@Gumbo Excellent answer. But I have a question: is there any way of including the file directly without using the $lang_file variable something like this not sure: include_once 'languages/lang.'.$_SESSION['lang'].'php;
janoChen
@janoChen: It is possible to do it that way. But you should take the case that `$_SESSION['lang']` is not set or doesn’t contain a valid value. Then you would get just `languages/lang..php`. But if you ensure that `$_SESSION['lang']` does always exist and has a valid value, you sure can do it that way.
Gumbo
+2  A: 
$lang_file = 'lang.' . ($_SESSION['lang']) . 'php';
if(!file_exists($lang_file))
{
    $lang_file = 'lang.en.php';
}

although it isn't secure against injections. It does, however, allow you to add new language codes without modifying the code.

ZombieSheep
I think it would be hard to inject something into the $_SESSION variable. The session variable is never accessed by the client, it is merely connected to the client via a cookie. However, the $_COOKIE variable is writeable by the client via HTTP headers.
jwandborg
+2  A: 

Or:


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

This will work perfectly fine

$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';
}

With this, you won't have to edit the code every time your're adding a new language and you will not have to worry about security.

jwandborg
Carson Myers
You're right, I've changed my post to reflect your changes. $lang_file_tmp is there to remove the need to type the concatenation sequence more than once.
jwandborg