Самый быстрый способ определения страны пользователя - PullRequest
6 голосов
/ 05 марта 2011

Мне нужно определить страну пользователя и показать язык сайта по его / ее стране.(Турецкий для турецких людей, английский для всех остальных)

Как я могу сделать это самым быстрым способом?Производительность важна для меня.

Я ищу IPInfoDB 'API , есть ли лучшая альтернатива?

(я использую PHP)

Ответы [ 7 ]

4 голосов
/ 26 июня 2017

Хорошо для людей, которые могут посетить в 2017 году, это решение очень простое в использовании

<button class="btn dropdown-toggle" style="cursor:pointer;z-index:1000!important;margin-top:-67px;background:none!important;font-size:1.4em;" onclick="window.location.href='language'">
(a)  <?php
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$url = "http://api.wipmania.com/".$ip;
(h) $country = file_get_contents($url); //ISO code for Nigeria it is NG check your country ISO code
?>

<?php if ($country == ""){
echo "Country not found";   
} else { ?>
<script>
var map = "<?php echo $country ?>";
$.ajax({
type : 'POST', 
url : 'http://www.mowemy.com/countryflag.php',
data :  {map: map}, 
success : function(r) { 
//console.log("success: " + r); 
$('#mumil').html(r); 
} })
</script>
<?php } ?>

<div id ="mumil" style="font-size:13px!important;margin-top:5px;"></div>
</button>

позвольте мне обозначить буквой A - H - это скрипт для определения вашего номера ISO для страны, в которой находится моя страна. Нигерия. Это NG. Вы можете выполнить поиск по номеру ISO в вашей стране с помощью Google, с помощью этого скрипта он автоматически определяется. Затем я создал страницу с некоторой информацией о том, что вы запускаете AJAX на эту страницу, и она отправляет обратно цвет и название флага страны просто и легко ПОЖАЛУЙСТА, ВЫЗВАТЬ JQUERY ПЕРЕД АЯКСОМ, ЧТОБЫ ЗАПУСТИТЬ AJAX, ЕСЛИ ЭТО НЕ БУДЕТ РАБОТАТЬ УДАЧИ

3 голосов
/ 05 марта 2011

Вы можете использовать API здесь http://www.hostip.info/use.html, если вы можете полагаться на внешний сайт.

Вы также можете использовать GeoIP PHP API

Конечно, реализация сценария, связанного с Orbit, может просто избавить вас от хлопот с API.

Удачи.

2 голосов
/ 03 апреля 2014

Лучший способ сделать это - использовать библиотеку «GAE-IP-TO-COUNTRY»: https://github.com/andris9/GAE-IP-TO-COUNTRY/tree/master/src/ip_files

Пример использования (вы должны скопировать каталог "ip_files" на ваш сервер):

function iptocountry($ip) {    
    $numbers = preg_split( "/\./", $ip);    
    include("./ip_files/".$numbers[0].".php");
    $code=($numbers[0] * 16777216) + ($numbers[1] * 65536) + ($numbers[2] * 256) + ($numbers[3]);    
    foreach($ranges as $key => $value){
        if($key<=$code){
            if($ranges[$key][0]>=$code){$country=$ranges[$key][1];break;}
        }
    }
    return $country;
}

$country=iptocountry($_SERVER['REMOTE_ADDR']);
echo $country;
1 голос
/ 05 марта 2011

Как уже отмечали другие, было бы лучше проверить заголовок HTTP Accept-Language для турецкого языка Если это предпочтительный язык, подайте его. В противном случае служить английский. Вот код .

1 голос
/ 05 марта 2011

Эта ссылка должна быть очень полезной:

http://www.phptutorial.info/iptocountry/the_script.html

Вы сможете скачать с нее необходимые файлы и скрипты.

0 голосов
/ 01 февраля 2018

Вот прямой путь, который мне нравится использовать

<?php
class GeoIp
{
    protected $api = 'https://ipapi.co/%s/json/';

    protected $properties = [];

    //------------------------------------------------------
    /**
    *   __get
    *
    * @access public
    * - @param $key string
    * - @return string / bool
    */  
    public function __get($key)
    {
        if( isset($this->properties[$key]))
        {
            return $this->properties[$key];
        }

        return null;
    }

    //------------------------------------------------------
    /**
    *   request_geoip
    *
    * @access public
    * - @return void
    */
    public function request_geoip($ip)
    {
        $url = sprintf($this->api, $ip);
        $data = $this->send_geoip_request($url);
        $this->properties =  json_decode($data, true);
        //var_dump($this->properties);
    }

    //------------------------------------------------------
    /**
    *   send_geoip_request
    *
    * @access public
    * - @param $url string
    * - @return json
    */
    public function send_geoip_request($url)
    {
        $loc_content = file_get_contents($url); 

        return $loc_content;
    }
}

//You can access it like this:
$geo = new GeoIp;
$geo->request_geoip('foo');
echo $geo->country;

?>

Посетите этот сайт для получения дополнительной информации

0 голосов
/ 08 августа 2016

Я закодировал следующий материал, используя Accept-Language, как указали другие пользователи:

function GetAcceptedLangs()
{
    $res=array();
    $a=getallheaders();
    if(isset($a["Accept-Language"]))
    {
        $aceptlangs=explode(",",str_replace(array(';','0','1','2','3','4','5','6','7','8','9','.',"q="),array(',','','','','','','','','','','','',""),$a["Accept-Language"]));
        foreach($aceptlangs as $i=>$v)
        {
            if(trim($v)!="")
                $res[]=trim($v);
        }
    }
    return $res;
}

Простой

print_r(GetAcceptedLangs());

возврат в моем случае:

Array ( [0] => es-ES [1] => es [2] => en )

После этого вы можете определить такой массив, чтобы изменить его на значение вашего внутреннего языка, например:

$al={"ES-es"=>"es","es"=>"es","en"=>"en"......}

Они уже отсортированы по предпочтениям пользователя.

Если в массиве нет всех языков, вы можете перейти на язык по умолчанию на вашем сайте. Это также верно, если браузер не отправляет заголовок Accept-Language.

Другая версия, удаляющая значения субрегиона

function GetAcceptedLangs2()
{
    $res=array();
    $a=getallheaders();
    if(isset($a["Accept-Language"]))
    {
        $aceptlangs=explode(",",str_replace(array(';','0','1','2','3','4','5','6','7','8','9','.',"q="),array(',','','','','','','','','','','','',""),$a["Accept-Language"]));
        foreach($aceptlangs as $i=>$v)
        {
            $va=trim($v);
            if(($pos=strpos($va,"-"))!==false)
                $l=substr($va,0,$pos);
            else
                $l=$va;
            if($l!="" && !isset($check[$l]))
            {
                $check[$l]=1;
                $res[]=$l;
            }
        }
    }
    return $res;
}

Это вернулось бы в моем случае

Array ( [0] => es [1] => en )
...