(CakePHP2.x)英語・日本語どっち?の判断と切り替えの処理
英語版と日本語版があるサイト。
どちらでページを表示すべきか?
どのように切り替えるべきか?
私が採用した方法は下記のとおり。
言語切り替えの方法
URLパラメータを使います。サイト内のどのページからでも、ヘッダに設置したボタンをクリックして言語を切り替えられます。
http://example.com/controller/action/lang:eng
コントローラでは、下記のようにしてパラメータの値を取り出せます。
(コントローラ)
$lang = $this->params['named']['lang'];
表示言語の選択
下記の優先順位に従って判断していきます。- URLパラメータ
- 過去の設定を保存したクッキー
- ユーザが使っているブラウザの言語設定
- 上のどの方法でも言語名を取り出せなかった場合の初期値
ユーザのブラウザの言語設定を取り出す方法は、下記が分かりやすいです。
【参考】
【PHP】訪問者の言語を自動認識して適正なページを表示する/ - サイブリッジラボ
http://labs.cybridge.jp/2011/11/php-1.html
実際のコード
わざわざ2文字の"en"ではなく3文字の"eng"を使うのには理由があります。
(AppController.php)
function beforeFilter() {
//表示言語を判別する。
if (isset($this->params['named']['lang'])) {
//URL中の"lang"パラメータ
$lang = $this->params['named']['lang'];
} elseif ($cookie = $this->Cookie->read('lang')) {
//クッキー
$lang = ($cookie == 'jpn')
? 'jpn'
: 'eng';
} elseif (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
//ユーザのブラウザの言語設定
$arr = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
$arr = explode(';', $arr[0]);
$lang = ($arr[0] == 'ja')
? 'jpn'
: 'eng';
} else {
//全てに当てはまらなかった場合の初期値
$lang = 'jpn';
}
//CakePHPでの表示言語を指定。
Configure::write('Config.language', $lang);//クッキーに言語情報を格納。
$this->Cookie->write('lang', $lang, true, '30 Days');
CakePHPの多言語対応機能を使う場合、"app/Locale/"下の各言語のフォルダは3文字の短縮名にしなければならないからです。
もしかしたら、ちょっとした書き換えで2文字名のフォルダも使えるようになるのかもしれませんが、めんどくさいので原則に従っています (^ ^;)