Определение языка пользователя по IP-адресу (геолокация)

Я интегрировал два фрагмента PHP-кода, найденные на разных веб-сайтах. Первая часть кода определяет, в какой стране вы находитесь, а вторая определяет язык. Я попытался запустить его, но безуспешно. У меня не выдает ошибку, просто пустой белый экран.

Вот код:

<?php

function visitor_country()
{
    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    $result  = "Unknown";
    if(filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif(filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }

    $ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip));

    if($ip_data && $ip_data->geoplugin_countryName != null)
    {
        $result = $ip_data->geoplugin_countryName;
    }

    return $result;
}

    session_start();
    header('Cache-control: private'); // IE 6 FIX

    if (isset($_GET['lang'])) {
            $lang = $_GET['lang'];

            // register the session and set the cookie
            $_SESSION['lang'] = $lang;

            setcookie('lang', $lang, time() + (3600 * 24 * 30));
    } else if (isset($_SESSION['lang'])) {
            $lang = $_SESSION['lang'];
    } else if (isset($_COOKIE['lang'])) {
            $lang = $_COOKIE['lang'];
    } else {
            $lang = 'en';
    }

    switch ($lang) {
            case 'en':
            $lang_file = 'lang.en.php';
            break;

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

            if(visitor_country() == "Germany") {
                default:
                $lang_file = 'lang.de.php';
                echo "Germany";
            } else {
                default:
                $lang_file = 'lang.en.php';
                echo "Not in Germany";
            }

    }

    include_once 'languages/' . $lang_file;



?>

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


person Hrach Ghapantsyan    schedule 03.11.2013    source источник
comment
Пустая белая страница в большинстве случаев указывает на ошибку сервера. У вас есть доступ к логам вашего сервера?   -  person puelo    schedule 03.11.2013
comment
Нет ошибок в журнале ошибок PHP, может быть, это код?   -  person Hrach Ghapantsyan    schedule 03.11.2013
comment
Не используйте эти ошибки, подавляющие @s!   -  person Marcel Korpel    schedule 03.11.2013


Ответы (1)


Ваш код возвращает ошибку: PHP Parse error: syntax error, unexpected 'default' (T_DEFAULT) in yourfile.php on line. Это означает, что вы неправильно используете default в операторе switch. Замените последнюю часть кода на это:

default:
  if(visitor_country() == "Germany") {
     $lang_file = 'lang.de.php';
     echo "Germany";
  } else {
     $lang_file = 'lang.en.php';
     echo "Not in Germany";
  }

Выньте default из инструкции if/else.

РЕДАКТИРОВАТЬ 1:

Убедитесь, что PHP отображает ERRORS, WARNING и NOTICES для правильной отладки кода:

ini_set('display_errors', -1);

РЕДАКТИРОВАТЬ 2:

Если он работал без оператора switch, как вы сказали, то вы должны убедиться, что файлы lang.en.php/lang.de.php действительно существуют.

РЕДАКТИРОВАТЬ 3:

Вы подавляете ошибки, имея @ перед json_decode(file_get_contents. Скорее всего, вам придется отредактировать php.ini и включить allow_url_fopen, чтобы он заработал. Бьюсь об заклад, если вы удалите @, вы получите сообщение об ошибке:

 Warning: file_get_contents(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in

Я бы настоятельно не рекомендовал использовать этот метод для определения языка пользователя и включения allow_url_fopen, так как это может быть уязвимостью! Если вам интересно, я предоставлю вам гораздо лучшее решение для определения языка пользовательских браузеров.

person Ilia    schedule 03.11.2013
comment
Просто заставил его работать, пришлось удалить default. Думаю, я этого не видел. Спасибо - person Hrach Ghapantsyan; 03.11.2013
comment
Нет, вы должны сохранить switch. Позвольте мне обновить свой ответ полным примером онлайн. - person Ilia; 03.11.2013
comment
Вы должны сохранить переключатель и просто удалить один из default, который находится внутри if/else, и поместить его прямо над ним. Пример: codepad.org/Nq6Np3X2 - person Ilia; 03.11.2013
comment
Сейчас не работает, работал без выключателя. Предложения? (использую ваш код) - person Hrach Ghapantsyan; 03.11.2013
comment
@HrachGhapantsyan Посмотрите на мою правку 1 и скажите, какую ошибку вы видите? - person Ilia; 03.11.2013
comment
давайте продолжим это обсуждение в чате - person Hrach Ghapantsyan; 03.11.2013