あなたの疑問にお答えしますように、のPHPで利用可能なAccept-Language
HTTP/1.1ヘッダーを解析する必要があります。配列のような方が良いPHP以内に対応できる構造に解析するために、この最初のニーズ、:
da, en-gb;q=0.8, en;q=0.7
のために戻ります
/**
* Convert Accept Language to sorted PHP array
*
* Related HTTP Specs:
* <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4>
* <http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.9>
*
* @param string $accept header value
* @return array ([language-range] => qvalue, ...)
*/
function http_accept_language_array($accept = NULL)
{
if (!$accept && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
$accept = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept = (string) $accept;
$pattern = '/([a-z]{1,8}(-[a-z]{1,8})?)(;q=([01](?:\.[0-9]{0,3})?))?(?=$|,[ ]*)/i';
preg_match_all($pattern, $accept, $matches);
$array = array();
if (count($matches[1]))
{
list(, $ranges,,, $qvals) = $matches;
# normalize ranges
foreach ($ranges as &$range)
$range = strtolower($range);
unset ($range);
# set default qvalue 1
foreach ($qvals as &$qval)
if ('' === $qval) $qval = '1';
unset ($qval);
$array = array_combine($ranges, $qvals);
arsort($array, SORT_NUMERIC);
}
return $array;
}
:
array(3) {
["da"] => string(1) "1"
["en-gb"] => string(3) "0.8"
["en"] => string(3) "0.7"
}
あなたはその後、見つけるために、このソートされた配列を解析する必要がありますあなたの最初の試合、en
デフォルト値でお好みの設定:
$lang = 'en';
foreach (http_accept_language_array() as $range => $qvalue)
{
if (preg_match('/^zh[$-]/', $range))
{
$lang = 'cn';
break;
}
}
最後にあなたがに基づいてリダイレクトを行うことができます210(またはincludeまたは何でも):
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com/$lang/");
あなたがこれに対処するため、既製のライブラリーを探しているなら、1つの既存のソリューションがSymfony'sHttpFoundation\Request
であるか、PEARにHTTP::negotiateLanguage
があります。
PHPの国際拡張が関連している別の低レベルの機能を有している、しかし、それだアレイが、単一の値を提供しない:よりHTTP関連情報のための別の一般的なリソースがAdvanced handling of HTTP requests in PHPあるlocale_accept_from_http
を。
良い指示をいただきありがとうございます。申し訳ありません、私は今、私の最初のサイトをオンラインで準備しています。 '301 redirect'はウェブスパイダーによって不正行為とみなされますか?私はこの行動が私のサイトをGoogleサンドボックスに入れさせるのではないかと心配しています... – cj333
それは少し依存します。 cnバージョンと同じように、en言語(HTTPメタタグを追加)でサイトのenバージョン内に表示します。 enはデフォルトであるため、googleは主にenバリアントを処理します。各ページのcnバージョンへのリンクを追加すると(言語切り替えのような中国語の場合)、googleはそのコンテンツも見つけて中国語の読者に提供します。 **編集**参照http://www.w3.org/International/tutorials/language-decl/ – hakre
等しく重み付けされた2つの言語がある場合、関数はそれらの言語の順序を逆にします。それが望ましいのかどうかはわかりません。私はオーダー自体にも価値があると信じています。 – Michielvv