i18n :: setLocale cakephp 3.6 - PullRequest
       82

i18n :: setLocale cakephp 3.6

0 голосов
/ 14 сентября 2018

в приложении 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'));
}

Но переменная locale в моих представлениях по-прежнему остается на en_US , даже если я нажал на ссылку FR , которая отправила параметр lang равняется fr_CA . Это из-за перенаправления я потерял свой язык? Если да, как я могу сохранить свой языковой стандарт после отправки моего параметра lang ?

Спасибо заранее за любую помощь.

ОБНОВЛЕНИЕ Я удалил перенаправление, теперь значение locale в контроллере страниц является правильным, но как только я получаю доступ к другой странице (например, о странице или чем-то из контроллера страниц) ) значение locale восходит к en_US. Так в чем же смысл I18n :: setLocale в CakePHP 3.6, если значение теряется при переходе к другим областям сайтов? Таким образом, мы должны постоянно призывать его к работе?

1 Ответ

0 голосов
/ 14 сентября 2018

CakePHP не хранит информацию о локали между запросами. Если вы хотите, чтобы языковой стандарт сохранялся для пользователя, вы должны хранить его где-нибудь (сеанс, файлы cookie, параметр в url, часть исправления URL-адреса, запись пользователя в db ...) и извлекать его при каждом новом запросе (например, в initialize() вашего AppController) и установите его.

Вы также можете использовать Фильтр выбора локали , который будет выбирать локаль на основе данных запроса.

...