最近多言語対応のシステムを作ることが多いのでメモ。
サブドメインで言語を切り替える
http://ja.example.comのようにサブドメイン部分を言語コードとして利用する場合は、AppControllerのbeforeFilterなどで
// AppController::beforeFilter
$httpHost = env('HTTP_HOST');
preg_match('/([a-z]{2}\.)?.*/', FULL_BASE_URL, $match);
Configure::write('Config.language', $match[1]);
サブディレクトリで言語を切り替える
http://example.com/jaのようにサブディレクトリの1階層目を言語コードとして利用する場合は、Config/routes.phpで
// Config/routes.php
// localeというnameパラメータを定義する(リバースルーティングを効かせるため)
Router::connectNamed(array('locale'), array(
'default' => true,
));
Router::connect('/', array('locale' => 'en', 'controller' => 'contents', 'action' => 'top'));
Router::connect('/:locale', array('controller' => 'contents', 'action' => 'top'));
Router::connect('/:locale/:controller/:action', array(
'locale' => 'en',
'action' => 'index',
));
Router::connect('/:locale/:controller/:action/*', array(
'locale' => 'en',
'action' => 'index',
));
そして、AppControllerのbeforeFilterで
Configure::write('Config.language', $this->request->params['locale'];);
routes.phpの書き方をいまいち理解してなくてこれが最適か自信がないけど意図したとおりには動いてくれています。
