i18n::设置区域设置cakephp 3.6

rqcrx0a6  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(175)

在一个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>

最后,在PagesControllerdisplay操作中,我有以下内容:

public function display(...$path)
{
    // Other non-related codes....

    $locale = I18n::getLocale();

    $this->set(compact('locale'));
}

但是我的视图中的locale变量仍然停留在en_US,即使我单击了发送lang参数等于fr_CAFR链接。是否因为重定向而丢失了我的区域设置?如果是这样,在发送lang参数后如何保留我的区域设置?
我删除了重定向,现在页面控制器中的locale值是正确的,但只要我访问另一个页面(例如关于页面或来自Pages控制器的内容)、locale的值返回到en_US。那么,如果在我们导航到站点的其他区域时丢失了该值,那么CakePHP 3.6中的I18n::setLocale的真正意义是什么呢?所以我们必须不断地调用它才能工作?

jvidinwx

jvidinwx1#

CakePHP不会在请求之间存储区域设置信息。如果你想为用户保存区域设置信息,你应该把它存储在某个地方(session,cookies,url中的param,url补丁的一部分,db中的用户记录...),并在每次新的请求时检索它(例如在你的AppControllerinitialize()中)并设置它。
您还可以使用区域设置选择器过滤器,它将根据请求数据选择区域设置。

相关问题