【问题标题】:i18n::setLocale cakephp 3.6i18n::setLocale cakephp 3.6
【发布时间】:2019-02-18 16:50:02
【问题描述】:

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

<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'));
}

但是,即使我点击了发送 lang 参数等于 fr_CA。是因为重定向,我失去了我的语言环境吗?如果是这样,我如何在发送 lang 参数后保存我的语言环境?

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

【问题讨论】:

    标签: php cakephp php-5.6 cakephp-3.6


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 2020-05-13
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多