【发布时间】:2019-02-18 16:50:02
【问题描述】:
在 CakePHP 3.6 应用程序中,我在 AppController 的 beforeFilter 方法中有以下内容:
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 的 display 动作中,我有以下内容:
public function display(...$path)
{
// Other non-related codes....
$locale = I18n::getLocale();
$this->set(compact('locale'));
}
但是,即使我点击了发送 lang 参数等于 fr_CA。是因为重定向,我失去了我的语言环境吗?如果是这样,我如何在发送 lang 参数后保存我的语言环境?
我删除了重定向,现在 Pages Controller 中 locale 的值是正确的,但是一旦我访问另一个页面(例如关于页面或来自 Pages 控制器的内容),值locale 回到 en_US。那么如果当我们导航到站点的其他区域时价值丢失了,那么 CakePHP 3.6 中I18n::setLocale 的真正意义是什么?所以我们必须不断地调用它才能让它工作?
【问题讨论】:
标签: php cakephp php-5.6 cakephp-3.6