i18n::setLocale cakephp 3.6
i18n::setLocale cakephp 3.6
在 CakePHP 3.6 应用程序中,我在 AppController
的 beforeFilter
方法中有以下内容:
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>
最后在 PagesController 的 display 操作中,我有以下内容:
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 补丁的一部分、数据库中的用户记录...),并在每个新请求(例如在 AppController
的 initialize()
中)并设置它。
您也可以使用 Locale Selector Filter,它将根据请求数据选择语言环境。
在 CakePHP 3.6 应用程序中,我在 AppController
的 beforeFilter
方法中有以下内容:
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>
最后在 PagesController 的 display 操作中,我有以下内容:
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 补丁的一部分、数据库中的用户记录...),并在每个新请求(例如在 AppController
的 initialize()
中)并设置它。
您也可以使用 Locale Selector Filter,它将根据请求数据选择语言环境。