web-dev-qa-db-ja.com

PHPでクライアントのロケールを検出する最も簡単な方法

PHPを使用して、訪問者が私のウェブサイトでどの国から来たかを検出できるようにしたいと思います。

これをセキュリティ対策や重要なものとして使用するつもりはないことに注意してください。一部の単語のスペルを変更するだけです(アメリカ人は「登録」という単語には2 Lあると信じているようです.... crazy yanks)、そしておそらく「Select your country」リストにデフォルトのオプションを与えること。

そのため、Geolocationデータベースを使用するのは少しおおざっぱであり、新しいPHPライブラリだけをインストールするので、いじくり回したくないので、訪問者がどの国から来たのかを知る最も簡単で簡単な方法は何ですか?

32
nickf

保証はありませんが、ほとんどのブラウザは、米国からの場合はen-usを指定するAccept-Language HTTPヘッダーを送信します。一部の古いブラウザはenだとだけ言っていました。また、すべてのマシンが適切に設定されているわけではありません。しかし、それは良い最初の推測です。

English-UKベースのユーザーは通常、システムまたはユーザーロケールをEnglish-UKに設定します。これにより、デフォルトのブラウザー構成では、Accept Languageヘッダーとしてen-gbが必要になります。 (このen-ukの以前のバージョン。タイプミスで申し訳ありませんでした。)他の国にもen-za(南アフリカ)などのenロケールがあり、主に理論的にはen-jpのような組み合わせも可能です。

ただし、Geo-IPベースの推測は、優先される言語/ロケールでは正しい可能性が低くなります。 Googleは、IPアドレスの地理位置情報に基づくコンテンツネゴシエーションは理にかなっていると考えています。これは、日本または韓国にいるときに本当に私を困らせます...

21
JasonTrue

PHPは5.3.0以降、$ _ SERVER ['HTTP_ACCEPT_LANGUAGE']変数をロケールに解析する関数を提供しています。

http://www.php.net/manual/en/locale.acceptfromhttp.php

$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"
25
Trevor Goodyear

HTTP_ACCEPT_LANGUAGEヘッダー($ _SERVERから)。ほとんどのブラウザーが送信します。

例として Zend_Locale をご覧ください。あるいは、libを使用することもできます。

13
chroder

あなたはいくつかのIP比較を行うことができますなしライブラリ全体でそれを行うことができます。

ソリューション#1

APIを使用します。これにより、ユーザー側で何も必要ありません。これは国を知らせるWeb APIです。

 Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
 Return : Country: UNITED STATES (US)

ソリューション#2

しかし、ブラウザエージェント言語を使用することを考えましたか?あなたはそれから英語のタイプを知ることができるかもしれません。

ソリューション#3

BlockCountry と呼ばれるこのWebサイトでは、国別のIPのリストを入手できます。もちろん、ブロックする必要はありませんが、IPのリストを使用してそれらを比較できます(すべてのUS IPを取得します...)これは正確ではない可能性があります...

6

指定された目的を考えると、Accept-Languageヘッダーは、IPベースの地理位置情報よりも適切なソリューションです。実際、それはAccept-Languageの本来の目的です。

2
Dave Sherohman

$ _SERVER ["HTTP_ACCEPT_LANGUAGE"]を解析して、国とブラウザのロケールを取得します

2
Slipo

HTTP_ACCEPT_LANGUAGEを使用しています

    $localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
    if(is_array($localePreferences) && count($localePreferences) > 0) {
       $browserLocale = $localePreferences[0];
       $_SESSION['browser_locale'] = $browserLocale;
    }
1
Mircea Stanciu

私が使用した訪問者の国を特定するために GeoIP 拡張子を使用します。

1
CMS

または、次の操作を実行できます。

http://www.maxmind.com/app/geoip_country から「geoip.dat」とgeoip.incをダウンロードします

geoip.incヘッダーには、その使用方法が記載されています(例:初期化と残り...)。

0
zale

1つ目は、視聴者が望む言語です。2つ目は、提供できるものです。

$SystemLocales = explode("\n", Shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US
for($i=0;$i<count($BrowserLocales);$i++) {         
  list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8"
  for($j=0;$j<count($SystemLocales);$j++) {
    if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){
      setlocale(LC_ALL, $SystemLocales[$j]);
      break 2; // found and set, so no more check is needed
    }
  }
}

たとえば、鉱山システムは次の機能のみを提供します。

  • C
  • POSIX
  • pl_PL.UTF-8

私のブラウザ言語は、pl、en-US、en =>なので、正しいロケールはpl_PL.UTF-8のみです。

正常な比較が見つからない場合-setlocaleはまったくありません。

0
Tomasz Brzezina

GeoIPエクステンションは良い選択です。

0
pakaian bayi

http://countries.nerd.dk サービスは、IPから国へのマッピングに使用するサービスです。それは本当にうまく機能し、DNSに基づいているので、うまくキャッシュされます。

外部サービスに依存したくない場合は、ローカルで使用するためにデータベースをダウンロードすることもできます。

0
Greg Hewgill