・実現したいこと
ページ内にも言語選択のボタンを設置しており
英語ページからアクセスしたときのみ、
リダイレクトさせずに日本語ページを表示できるようにしたいです。
下記の認識で話を進めます。違ってたらすみません。
英語ページ内で「日本語」を選択した時にそのまま日本語ページにアクセスしたい。(自動リダイレクト無効)
→ 上記工程で一度日本語ページに入ったら、その後すべてのリンクも日本語ページにアクセスする
プログラムコードだと$_SERVER['HTTP_ACCEPT_LANGUAGE']
しか判断基準がないので、何かしらの上書きロジックが必要となります。URLのGETクエリストリングでもいいですが、すべてのページで引き回さなければならないので、Cookieを参照するようにして設定値を引き回します。
Cookie+JavaScript
$languages
配列が空なら自動的にリダイレクトしないので、リンクにあるとおりのURLに遷移します。したがって、Cookieが設定されていれば、日本語・英語の指定を手動で行ったことになるので配列を空にします。
php
1//$_COOKIE['Lang']取得
2$cookie = filter_input(INPUT_COOKIE, 'Lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
3$cookie = $cookie == 'ja' ? 'ja' : ($cookie == 'en' ? 'en' : null);
4
5$languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
6$languages = empty($cookie) ? array_reverse($languages) : [];
7
8$result = '';
9
10foreach ($languages as $language) {
11 if (preg_match('/^en/i', $language)) {
12 $result = 'English';
13 header("Location: /en");
14 } elseif (preg_match('/^ja/i', $language)) {
15 $result = 'Japanese';
16 header("Location: ");
17 }
18}
日本語・英語の選択がセレクトボックス
の場合は下記のように書きます。jqueryとjs-cookieを使っています。js-cookieはjquery.cookieの後継です。
https://github.com/js-cookie/js-cookie
js
1//Cookie保存
2$(日本語|英語).on('change', function (e) {
3 var lang = $(e.target).val();
4 Cookies.set('Lang', lang , {path: '/'});
5});
日本語・英語の選択がセレクトボックスではなく、Aリンク
の場合は下記のように書きます。
js
1//Cookie保存
2$(日本語|英語).on('click', function (e) {
3 e.preventDefault();
4 var lang = $(e.target).attr('href').indexOf('/en') >= 0 ? 'en' : 'ja';
5 Cookies.set('Lang', lang , {path: '/'});
6});
GET+Cookie
言語選択時のCookie保存をJavaScript側に書きましたが、どうしてもPHP側で処理したい場合は、言語選択時のリクエストURLにクエリストリングを追加します。(GETパラメーター)
html
1<a href="/ja/xxx?lang=ja">日本語</a>
2<a href="/en/xxx?lang=en">English</a>
そして、PHP側でクエリストリングを取得してCookieに保存しておきます。クエリストリングまたは、Cookieが設定されていれば、日本語・英語の指定を手動で行ったことになるので配列を空にします。
php
1//$_GET['lang']取得
2$query = filter_input(INPUT_GET, 'lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
3
4//Cookieに保存
5if (! empty($query) && ($query == 'ja' || $query == 'en')) {
6 setcookie('Lang', $query, 0, '/');
7}
8
9//$_COOKIE['Lang']取得
10$cookie = filter_input(INPUT_COOKIE, 'Lang', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
11$cookie = $cookie == 'ja' ? 'ja' : ($cookie == 'en' ? 'en' : null);
12
13$languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
14$languages = empty($cookie) && empty($query) ? array_reverse($languages) : [];
15
16$result = '';
17
18foreach ($languages as $language) {
19 if (preg_match('/^en/i', $language)) {
20 $result = 'English';
21 header("Location: /en");
22 } elseif (preg_match('/^ja/i', $language)) {
23 $result = 'Japanese';
24 header("Location: ");
25 }
26}