我在 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')));
_setLanguage()
从 AppController 调用的方法beforeFilter()
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;