ブラウザの言語設定を利用して言語を判別する

前回の記事では、接続元のIPアドレスを調べて、日本国外からのアクセスの場合にグローバルサイトに誘導するという方法をまとめましたが、この記事ではIPアドレスではなく、ユーザーが利用しているブラウザの言語設定を利用して、その言語にあったサイトに誘導する方法をまとめます。
厳密にIPを知る必要はなく、ユーザーがいつも閲覧している言語にあった情報を提供できればよい、というケースに適しています。

ブラウザの言語設定とは

各ブラウザには、ユーザーごとに主要な言語の設定ができる機能があります。

Google Chrome (118.0.5993.72) の場合は、【設定>言語】に次のような画面があり、現在の設定内容が表示されています。
5番目の「ノルウェー語 (ブークモール)」って何でしょうね?覚えがありませんが…。

1番から順に優先言語が指定されているので、1番に指定された言語がこのユーザーに適した言語、と言えます。
この設定内容は、PHPやJavaScriptで取得することができるため、この値をもとに、最適な言語サイトに誘導することができる、という理屈です。

PHP

PHPでは、次のコマンドでブラウザの言語設定を出力することができます。

echo $_SERVER['HTTP_ACCEPT_LANGUAGE'];

試しに上記のChromeの状態で実行すると、次のように出力されました。

ja,en-US;q=0.9,en;q=0.8,fr;q=0.7,nb;q=0.6

;q=」は優先順位を表し、1の場合は省略されることから、上記は次を意味しています。

  • 優先順位 1:ja(日本語)
  • 優先順位 0.9:en-US(アメリカ英語)
  • 優先順位 0.8:en(英語)

このことから、$_SERVER['HTTP_ACCEPT_LANGUAGE']; で取得した値を分解して、言語タグ(ロケール識別子)を取り出せば、ユーザーが期待する言語の判別ができる、ということですね。
中国語の簡体語(zh-CN)と繁体語(zh-TW)の区別ができるよう、先頭2文字の国別コードだけでなく、ハイフンの後の地域コードを取得できるように分解します。

$langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

$lang_list = array();
foreach ( $langs as $lang ) {
  $lang_list[] = preg_replace( '/\;.*/', '', $lang );
}

後は、優先順位が1番目(配列の最初)の言語を条件に、リダイレクトなどの分岐処理を記述します。

if($lang_list[0] == 'ja'){
  header('Location: /ja/', true, 301);
  exit;
} else if($lang_list[0] == 'en' || $lang_list[0] == 'en-US'){
  header('Location: /en/', true, 301);
  exit;
}

「ユーザーが日頃使用している言語に合わせて分岐する」というのはとても自然で、処理もシンプルなのでいい方法ですね。

ちなみに、ブラウザの言語設定ではなく、アクセス元のIPアドレスを使用した分岐についてはこちらの記事で紹介しています。

この記事を書いた人