xxx.comというサイトにアクセスがあった時に、ログインユーザのブラウザで設定している言語に合わせて「xxx.com/ja」と「xxx.com/en」に遷移先を振り分けたいと思います。
動作環境
OS Mac
PHP 7.2.5
ブラウザ Chrome
ブラウザ言語に合わせてWebサイトの遷移先を切り替える方法
それでは実際にサンプルコードを見ながら行ってみます。
ブラウザの情報を確認してみる
いきなり、遷移させる方法の前に少し言語を取得する仕組みについてです。
getenv関数を使用するとユーザが使用しているブラウザやOS、使用している言語などがわかります。
サンプルコード
$_SERVERの値を画面に表示します。
<?php
var_dump( $_SERVER );
?>
上記のコードをxxx.phpに書きサーバー起動中にブラウザで確認するとユーザ情報が見れます。
その中の[“HTTP_ACCEPT_LANGUAGE”]にユーザの言語情報が表示さているはずです。
[“HTTP_ACCEPT_LANGUAGE”]=> string(23) “ja,en-US;q=0.9,en;q=0.8”
“ja,en-US;q=0.9,en;q=0.8” という部分についてですが、カンマ区切りで複数の言語が書かれています。
一番左にある「ja」がメインの言語になります。
その後に続く「en-US;q=0.9」という箇所が優先度となります。「ja」は q=1 になるなのですが 1 の場合は省略が可能です。引続く en;q=0.8 が次の言語となります。
優先される言語について
上記の”ja,en-US;q=0.9,en;q=0.8″ がどこからきているかといえばブラウザの個人設定となります。
以下Chromeの場合ですが、
上記の”ja,en-US;q=0.9,en;q=0.8″ がどこからきているかといえばブラウザの個人設定となります。
以下Chromeの場合ですが、
設定画面を開きます。
開いた画面で言語と検索すると、自分が使用しているメインの言語が上に表示されています。
日本語(ja)の次に英語 アメリカ合衆国(en-US;q=0.9,)、また英語(en;q=0.8)となっています。
遷移先を切り替える
サンプルコードが以下となります。
<?php
// サーバーからHTTP_ACCEPT_LANGUAGEを取得する
$langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
$langs_val = array();
// 配列の中身を最初の2文字に整形
foreach ( $langs as $lang ) {
$langs_val[] = substr($lang, 0, 2);
}
// 配列の0番目の要素に合わせて遷移先を指定する。
if($langs_val[0] == "ja"){
header('Location: /ja/', true, 301);
exit;
}else if($langs == "en"){
header('Location: /en/', true, 301);
exit;
}else{
header('Location: /en/', true, 301); exit;
}
?>
ひとつひとつ見ていきましょう。
explode()
$langs = explode(‘,’, $_SERVER[‘HTTP_ACCEPT_LANGUAGE’]);
explode()を使って取得した$_SERVER[‘HTTP_ACCEPT_LANGUAGE’]の値をカンマ区切りでarrayに値を入れてくれます。
var_dump($langs);で値を表示すると以下が表示されます。
array(3) { [0]=> string(2) “ja” [1]=> string(11) “en-US;q=0.9” [2]=> string(8) “en;q=0.8” }
foreach()
foreach()を使用して$langsの配列の中身の1つ1つを呼び出しsubstr()を使って最初の2文字を取得していきます。
var_dump($langs_val);で値を表示すると以下が表示されます。
array(3) { [0]=> string(2) “ja” [1]=> string(2) “en” [2]=> string(2) “en” }
header()
header()を使用して、指定のロケーション(url)へ遷移させています。
header(‘Location: /ja/’, true, 301);
header()はhttpリクエストのヘッダを指しています。301 は Status Code 301 を指定しており、リダイレクトさせています。true / false はヘッダを置換するかどうかです。 true と 301 は省略可能ですが指定しておいた方が安心です。
exit()
exitで処理を切って終わりです。
おわり
ブラウザの優先する言語を変更すると動作確認が行えます。