1

After I read some stuff on-line I came up with this PHP script to detect the browser's language and redirect the user to the correct website's version. Short said, if the user has a browser in Swedish, then the script should redirect to index.php, if not, then it should redirect the user to en.php.

It works fine in some computers and mobile phones and in others it blocks the website. I suppose that the script is not OK and is causing some conflict in older browsers.

So, could you please take a look at my script and tell me if I am doing anything wrong and how can I fix it?

Cheers!

<?php
include ('administration/fonts.php');
?><?php
$lc = ""; // Initialize the language code variable
// Check to see that the global language server variable isset()
// If it is set, we cut the first two characters from that string
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
    $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}
// Now we simply evaluate that variable to detect specific languages

if($lc == "sv"){
    header("location: index.php");
    exit();
}

else if($lc == "en"){
    header("location: en.php");
    exit();
}
?>

P.S. - Yes, the script is before the tag and there are no spaces between the "?>" tag and tag.

4
  • What do you mean by "it blocks the website"? Commented Mar 20, 2014 at 15:28
  • Only replace the line else if($lc == "en"){ with else { Commented Mar 20, 2014 at 15:29
  • What's the name of the file? Is it index.php? If yes, you've created an endless loop for swedish browsers. Commented Mar 20, 2014 at 15:32
  • @Reeno yes, your thought sounds logic actually... read the answer I gave to your answer below! Commented Mar 21, 2014 at 6:55

1 Answer 1

2

New answer after added details from the OP.

English users should be redirected, but Swedish user should stay on this site, so we'll rewrite the code like this (I added comments with // Reeno):

<?php
include ('administration/fonts.php');

$lc = ""; // Initialize the language code variable
// Check to see that the global language server variable isset()
// If it is set, we cut the first two characters from that string
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
    // Reeno: I added strtolower() if some browser sends upper case letters
    $lc = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2));
}
// Now we simply evaluate that variable to detect specific languages

// Reeno: Redirect all non-Swedish users to the English page (they can have "en", but also "dk", "de", "fr"...
if($lc != "sv"){
    header("location: http://www.domain.com/en.php");
    exit();
}
// Reeno: Swedish users stay on this site
?>
HTML code...

Old answer

You check for $lc == "sv" and $lc == "en" but you forgot the third case: $lc could be empty!

Rewrite the if at the end like this, so everybody with a non Swedish browser will get to en.php:

if($lc == "sv"){
    header("location: index.php");
    exit();
}
else {
    header("location: en.php");
    exit();
}
?>

btw header("location: ..."); requires an absolute URI like header("location:http://www.domain.com/en.php"); (some clients also accept relative URIs)

Sign up to request clarification or add additional context in comments.

8 Comments

No, his code is fine, because user should stay on current version if no language is present. In your case the user will be redirected always, not when necessary.
if the user has a browser in Swedish, then the script should redirect to index.php, if not, then it should redirect the user to en.php. The OP always expects a redirect
I still may be wrong :) See my comment to his question, now I think there's another problem
I have tested your code. The website still works but now the only version I see on the browser is the English one. Before I could see the Swedish one on IE and Safari which are in Swedish... I will ask someone to test it and let you know about the results later. Cheers!
But is the file you're calling the same file you're redirecting the Swedish users to? Or is it some other file, e.g. language.php? Is the code you posted the complete file or is there some HTML/PHP after the last ?>?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.