根据IP地址确定用户语言(地理定位) [英] Determining user language based on IP address (geolocation)

查看:646
本文介绍了根据IP地址确定用户语言(地理定位)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我整合了两个在不同网站上发现的PHP代码。代码的第一部分可以找出你所在的国家,第二部分代码确定语言。我试过运行它,但没有运气。它不会给我一个错误,只是一个空白的屏幕。



这是代码:

 <?php 

function visitor_country()
{
$ client = @ $ _ SERVER ['HTTP_CLIENT_IP'];
$ forward = @ $ _ SERVER ['HTTP_X_FORWARDED_FOR'];
$ remote = $ _SERVER ['REMOTE_ADDR'];
$ result =未知;
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& $ amp; ip_data-> geoplugin_countryName!= null)
{
$ result = $ ip_data-> geoplugin_countryName;
}

返回$ result;
}

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

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

//注册会话并设置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';
休息;

case'de':
$ lang_file ='lang.de.php';
休息;

if(visitor_country()==Germany){
default:
$ lang_file ='lang.de.php';
回声德国;
} else {
default:
$ lang_file ='lang.en.php';
回声不在德国;
}

}

include_once'languages /'。 $ lang_file;



?>

我不能包含语言代码,但请放心,它可以在我的网站上使用自动国家/地区检测。

解决方案

您的代码返回错误: PHP解析错误:语法错误,意外在行的yourfile.php中的'default'(T_DEFAULT)。这意味着您在 default > =nofollow> switch 声明。用你的代码替换你的最后一部分:

  default:
if(visitor_country()==Germany ){
$ lang_file ='lang.de.php';
回声德国;
} else {
$ lang_file ='lang.en.php';
回声不在德国;
}

取出默认 if / else 语句中。



编辑1:



确保PHP显示 ERRORS WARNING NOTICES $ b

  ini_set('display_errors',-1); $ c $正确调试您的代码:




编辑2:



如果是没有开关语句工作,就像你说的那样,那么你必须确保文件 lang.en.php / lang.de.php 确实存在。



编辑3:



你在 json_decode(file_get_contents )前面加上 @ 来抑制错误,你很可能不得不编辑你的 php.ini 并且启用 allow_url_fopen 来让它工作。我打赌如果你删除 @ ,你会得到一个错误:

 警告:file_get_contents():http:// wrapper在服务器配置中被allow_url_fopen = 0禁用

我不强烈建议使用这种方法来检测用户语言并启用 allow_url_fopen ,因为它可能存在安全漏洞!如果您有兴趣,我会为您提供更好的解决方案来确定用户眉毛ers'的语言。

I've integrated two pieces of PHP code found on different websites. The first part of code finds out what country you are in and the second one determines the language. I have tried running it but with no luck. It does not give me a error, just a blank white screen.

Here is the code:

<?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;



?>

I could not include the language code, but rest assured it works as I use it on my site without auto-country detection.

解决方案

You code returns an error: PHP Parse error: syntax error, unexpected 'default' (T_DEFAULT) in yourfile.php on line. It means that you're misusing default in switch statement. Replace your last part of your code with this:

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

Take out default from inside of if/else statement.

EDIT 1:

Make sure that PHP displays ERRORS, WARNING and NOTICES to properly debug your code:

ini_set('display_errors', -1);

EDIT 2:

If it was working without the switch statement, like you said, then you must make sure that files lang.en.php/lang.de.php really exist.

EDIT 3:

You are suppressing errors with having @ in-front of json_decode(file_get_contents. Most likely you would have to edit your php.ini and enable allow_url_fopen to make it work. I bet if you remove @, you will get an error:

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

I wouldn't strongly recommend using this kind of method to detect user language and enabling allow_url_fopen as it's possible security flaw! In case you're interested, I will provide you with much better solution for determining user browsers' language.

这篇关于根据IP地址确定用户语言(地理定位)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆