在 CakePHP 3.6 应用程序中,我有以下beforeFilter
方法AppController
:
public function beforeFilter(Event $event)
{
parent::beforeFilter($event);
$lang = $this->request->getQuery('lang');
if(!empty($lang) && in_array($lang, ['en_US', 'fr_CA'])) {
I18n::setLocale($lang);
return $this->redirect($this->referer());
}
}
在我的 default.ctp 布局中,我有链接可以在单击时更改语言,如下所示:
<ul>
<li><a href="<?= $this->Url->build(['?' => ['lang' => 'fr_CA']]); ?>">FR</a></li>
<li><a href="<?= $this->Url->build(['?' => ['lang' => 'en_US']]); ?>">EN</a></li>
</ul>
最后在PagesController的显示动作中,我有以下内容:
public function display(...$path)
{
// Other non-related codes....
$locale = I18n::getLocale();
$this->set(compact('locale'));
}
但是,即使我单击了发送lang参数等于fr_CA的FR链接,我视图中的语言环境变量仍然停留在en_US。是因为重定向,我失去了我的语言环境吗?如果是这样,我如何在发送我的lang参数后保存我的语言环境?
我删除了重定向,现在页面控制器中的区域设置值是正确的,但是一旦我访问另一个页面(例如关于页面或来自页面控制器的某些内容),区域设置的值就会回到 en_US。那么,I18n::setLocale
如果当我们导航到站点的其他区域时价值丢失了,那么 CakePHP 3.6 的真正意义是什么?所以我们必须不断地调用它才能让它工作?