在一个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());
}
}
在我的默认.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'));
}
但是我的视图中的locale变量仍然停留在en_US,即使我单击了发送lang参数等于fr_CA的FR链接。是否因为重定向而丢失了我的区域设置?如果是这样,在发送lang参数后如何保留我的区域设置?
我删除了重定向,现在页面控制器中的locale值是正确的,但只要我访问另一个页面(例如关于页面或来自Pages控制器的内容)、locale的值返回到en_US。那么,如果在我们导航到站点的其他区域时丢失了该值,那么CakePHP 3.6中的I18n::setLocale
的真正意义是什么呢?所以我们必须不断地调用它才能工作?
1条答案
按热度按时间jvidinwx1#
CakePHP不会在请求之间存储区域设置信息。如果你想为用户保存区域设置信息,你应该把它存储在某个地方(session,cookies,url中的param,url补丁的一部分,db中的用户记录...),并在每次新的请求时检索它(例如在你的
AppController
的initialize()
中)并设置它。您还可以使用区域设置选择器过滤器,它将根据请求数据选择区域设置。