i18n::setLocale cakephp 3.6
В приложении 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'));
}
Но переменная локали в моих представлениях все еще остается в en_US, даже если я нажал на ссылку FR, которая послала параметр lang, равный fr_CA. Это из-за перенаправления я потерял свой язык? Если так, как я могу сохранить свою локаль после отправки моего параметра lang?
Спасибо заранее за любую помощь.
ОБНОВЛЕНИЕ Я удалил перенаправление, теперь значение локали в Pages Controller является правильным, но как только я получаю доступ к другой странице (например, о странице или чем-то еще из контроллера Pages), значение локали возвращается к en_US. Так в чем же смысл I18n::setLocale в CakePHP 3.6, если значение теряется при переходе к другим областям сайтов? Таким образом, мы должны постоянно призывать его к работе?
1 ответ
CakePHP не хранит информацию о локали между запросами. Если вы хотите, чтобы языковой стандарт сохранялся для пользователя, вы должны хранить его где-нибудь (сеанс, файлы cookie, параметр в URL, часть URL-патча, запись пользователя в базе данных...) и извлекать его при каждом новом запросе (например, в initialize()
вашей AppController
) и установите его.
Вы также можете использовать фильтр выбора языка, который будет выбирать язык на основе данных запроса.