0

在 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 的真正意义是什么?所以我们必须不断地调用它才能让它工作?

4

1 回答 1

3

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

您还可以使用Locale Selector Filter,它将根据请求数据选择语言环境。

于 2018-09-14T10:34:48.297 回答