i18n::setLocale cakephp 3.6

i18n::setLocale cakephp 3.6

在 CakePHP 3.6 应用程序中,我在 AppControllerbeforeFilter 方法中有以下内容:

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 布局中,我有 link 可以在单击时更改语言,如下所示:

<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 即使我点击 FR link 发送 lang 参数等于 fr_CA。是因为重定向导致我丢失了语言环境吗?如果是这样,我如何在发送我的 lang 参数后保存我的语言环境?

我删除了重定向,现在页面控制器中 locale 的值是正确的,但是一旦我访问另一个页面(比如关于页面或页面控制器中的其他内容) ),locale 的值返回到 en_US。那么,如果当我们导航到站点的其他区域时该值丢失,那么 CakePHP 3.6 中 I18n::setLocale 的真正意义是什么?所以我们必须不断地调用它才能工作?

CakePHP 不存储请求之间的语言环境信息。如果您希望区域设置为用户保留,您应该将其存储在某个地方(会话、cookie、[=17= 中的参数]、url 补丁的一部分、数据库中的用户记录...),并在每个新请求(例如在 AppControllerinitialize() 中)并设置它。

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