(CakePHP2.x)英語・日本語どっち?の判断と切り替えの処理

英語版と日本語版があるサイト。
どちらでページを表示すべきか?
どのように切り替えるべきか?
私が採用した方法は下記のとおり。


言語切り替えの方法

URLパラメータを使います。

http://example.com/controller/action/lang:eng
サイト内のどのページからでも、ヘッダに設置したボタンをクリックして言語を切り替えられます。
コントローラでは、下記のようにしてパラメータの値を取り出せます。

(コントローラ)
$lang = $this->params['named']['lang'];


表示言語の選択

下記の優先順位に従って判断していきます。
  1. URLパラメータ
  2. 過去の設定を保存したクッキー
  3. ユーザが使っているブラウザの言語設定
  4. 上のどの方法でも言語名を取り出せなかった場合の初期値


ユーザのブラウザの言語設定を取り出す方法は、下記が分かりやすいです。


【参考】
PHP】訪問者の言語を自動認識して適正なページを表示する/ - サイブリッジラボ
http://labs.cybridge.jp/2011/11/php-1.html


実際のコード


(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');

わざわざ2文字の"en"ではなく3文字の"eng"を使うのには理由があります。
CakePHPの多言語対応機能を使う場合、"app/Locale/"下の各言語のフォルダは3文字の短縮名にしなければならないからです。
もしかしたら、ちょっとした書き換えで2文字名のフォルダも使えるようになるのかもしれませんが、めんどくさいので原則に従っています (^ ^;)