【发布时间】:2013-12-09 14:31:25
【问题描述】:
我在 CakePHP 2 中创建了一个多语言应用程序,我想包含一些不同语言的静态内容,但在设置路由时遇到了问题。
我让它适用于 language/controller/action 类型的路由,但如果我想要静态内容,我如何将 PagesController 路由到默认语言英语的 View/Pages/membership.ctp 和法语翻译的 View/fr/Pages/abonnement.ctp 中的视图,以便 url将只是/membership 还是/fr/abonnement?将翻译相互关联以使语言切换链接正常工作并且反向路由正常工作的最佳方式是什么?
我已经有以下路线
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/:language',
array('controller' => 'pages', 'action' => 'display', 'home'),
array('language' => 'en|fr', 'persist'=>array('language')));
Router::connect('/:language/:controller',
array('action' => 'index'),
array('language' => 'en|fr', 'persist'=>array('language')));
Router::connect('/:language/:controller/:action/*',
array(),
array('language' => 'en|fr', 'persist'=>array('language')));
从 AppController 的 beforeFilter() 调用的 _setLanguage() 方法
protected function _setLanguage() {
//if the cookie was previously set, and Config.language has not been set
//write the Config.language with the value from the Cookie
if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
$this->Session->write('Config.language', $this->Cookie->read('lang'));
}
//if the user clicked the language URL
else if ( isset($this->params['language']) && ($this->params['language'] != $this->Session->read('Config.language'))) {
// get the correct language code
$languageCodeEquivalencies = array(
'fr'=>'fra',
'en'=>'eng'
);
$languageCode = $this->params['language'];
if(in_array($languageCode, array_keys($languageCodeEquivalencies))) {
$languageCode = $languageCodeEquivalencies[$languageCode];
}
//then update the value in Session and the one in Cookie
$this->Session->write('Config.language', $languageCode);
$this->Cookie->write('lang', $languageCode, false, '20 days');
}
//ensure that both I18n and TranslateBehavior access the same language value.
if ($this->Session->check('Config.language')) {
Configure::write('Config.language', $this->Session->read('Config.language'));
}
}
我的语言切换链接看起来像这样
if($this->Session->read('Config.language') == 'fra'):
echo $this->Html->link('English', array_merge(array('language'=>'en'), $this->passedArgs));
else:
echo $this->Html->link('Français', array_merge(array('language'=>'fr'), $this->passedArgs));
endif;
【问题讨论】:
标签: php cakephp localization cakephp-2.4 cakephp-routing