i18n :: setLocale cakephp 3.6

问题描述 投票:0回答:1

在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的显示操作中,我有以下内容:

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

    $locale = I18n::getLocale();

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

但是我的视图中的locale变量仍然保持在en_US,即使我在FR链接上发送了lang参数等于fr_CA。是因为我丢失了我的语言环境的重定向?如果是这样,我如何在发送lang参数后保留我的语言环境?

感谢先进的任何帮助。

更新我删除了重定向,现在页面控制器中的语言环境的值是正确的,但是一旦我访问另一个页面(如关于页面或来自Pages控制器的东西),语言环境的值就会返回到en_US。那么当我们导航到网站的其他区域时,如果值丢失,那么CakePHP 3.6中I18n :: setLocale的真正意义何在?所以我们必须不断地呼吁它才能发挥作用?

php cakephp php-5.6 cakephp-3.6
1个回答
2
投票

CakePHP不会在请求之间存储区域设置信息。如果您希望区域设置为用户保留,则应将其存储在某处(会话,cookie,URL中的param,url补丁的一部分,db中的用户记录...),并在每个新请求中检索它(例如在initialize()中)你的AppController)并设置它。

您还可以使用Locale Selector Filter,它将根据请求数据选择区域设置。

© www.soinside.com 2019 - 2024. All rights reserved.