Скрипт обнаружения языка PHP

После того, как я прочитал кое-что в Интернете, я разработал этот PHP-скрипт для определения языка браузера и перенаправления пользователя на правильную версию веб-сайта. Короче говоря, если у пользователя есть браузер на шведском языке, то скрипт должен перенаправить на index.php, если нет, то он должен перенаправить пользователя на en.php.

Он отлично работает на некоторых компьютерах и мобильных телефонах, а в других блокирует веб-сайт. Я полагаю, что сценарий не в порядке и вызывает некоторые конфликты в старых браузерах.

Итак, не могли бы вы взглянуть на мой сценарий и сказать мне, если я делаю что-то не так и как я могу это исправить?

Ура!

<?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();
}
?>

PS - Да, сценарий находится перед тегом, и между тегом "?>" И тегом нет пробелов.

1 ответ

Решение

Новый ответ после добавления подробностей из ОП.

Английские пользователи должны быть перенаправлены, но шведский пользователь должен остаться на этом сайте, поэтому мы перепишем код следующим образом (я добавил комментарии с // 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...

Старый ответ

Вы проверяете на $lc == "sv" а также $lc == "en" но вы забыли третий случай: $lc может быть пустым!

Перепишите if в конце так, чтобы каждый, у кого не шведский браузер, en.php:

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

кстати header("location: ..."); требует абсолютного URI, как header("location:http://www.domain.com/en.php"); (некоторые клиенты также принимают относительные URI)

Другие вопросы по тегам