PHPでユーザのブラウザ言語に合わせてWebサイトの遷移先を切り替える方法

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で処理を切って終わりです。

おわり

ブラウザの優先する言語を変更すると動作確認が行えます。

php

Posted by Nakamoto