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

StackOverflow https://stackoverflow.com/questions/297542

  •  08-07-2019
  •  | 
  •  

質問

PHPを使用して、Webサイトで訪問者の出身国を検出できるようにしたいと思います。

セキュリティ対策として、または重要な何かのためにこれを使用しようとはしていないことに注意してください、いくつかの単語のスペルを変更するだけです(アメリカ人は、単語「登録」には2つのLがあると信じているようです。 ..クレイジーなヤンク)、そしておそらく「国を選択」でデフォルトのオプションを与えるためにリスト。

このように、Geolocationデータベースを使用するのはちょっとしたものであり、このためだけに新しいPHPライブラリをインストールすることをいじりたくありません。そのため、最も簡単で簡単な方法を見つけるには訪問者の出身国

役に立ちましたか?

解決

保証はありませんが、ほとんどのブラウザーは、米国からの場合は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アドレスの位置情報に基づくコンテンツネゴシエーションが理にかなっていると考えています。これは、私が日本や韓国にいるときに本当にイライラします...

他のヒント

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

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

$locale = Locale::acceptFromHttp(

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

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

<*>SERVER['HTTP_ACCEPT_LANGUAGE']); echo $locale; // returns "en_US"

ほとんどのブラウザが送信する HTTP_ACCEPT_LANGUAGE ヘッダー($ _SERVERから)をチェックアウトできます。

Zend_Locale 例として、またはライブラリを使用したい場合があります。

指定された目的があれば、Accept-LanguageヘッダーはIPベースのジオロケーションよりも適切なソリューションです。実際、まさにAccept-Languageの目的です。

国とブラウザのロケールを取得するには、$ _ SERVER [&quot; HTTP_ACCEPT_LANGUAGE&quot;]を解析します

訪問者の国を識別するために、非常に使いやすい GeoIP 拡張機能を使用しました。

HTTP_ACCEPT_LANGUAGEを使用しています

    $localePreferences = explode(",",

HTTP_ACCEPT_LANGUAGEを使用しています

<*>SERVER['HTTP_ACCEPT_LANGUAGE']); if(is_array($localePreferences) && count($localePreferences) > 0) { $browserLocale = $localePreferences[0];

HTTP_ACCEPT_LANGUAGEを使用しています

<*>SESSION['browser_locale'] = $browserLocale; }

http://countries.nerd.dk サービスは、IP-to-countryで使用するサービスですマッピング。それは本当にうまく機能し、DNSに基づいているため、キャッシュもよくできています。

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

または、以下を実行できます。

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

geoip.incヘッダーには、その使用方法が記載されています(たとえば、initializeとrest ...)

GeoIP拡張機能が適しています。

1つ目は、どの言語を視聴者が望んでいるか、2つ目-提供できるものです:

$SystemLocales = explode("\n", shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",

1つ目は、どの言語を視聴者が望んでいるか、2つ目-提供できるものです:

<*>

たとえば、鉱山システムは次のサービスのみを提供しています:

  • C
  • POSIX
  • pl_PL.UTF-8

および私のブラウザ言語は次のとおりです。pl、en-US、en =&gt;したがって、正しいロケールはpl_PL.UTF-8のみです。

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

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 =&gt;したがって、正しいロケールはpl_PL.UTF-8のみです。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top