Cakephp I18n setLocale不会更改语言

pftdvrlh  于 2023-06-06  发布在  PHP
关注(0)|答案(1)|浏览(209)

我有一个Cakephp 4项目国际化使用的工作,但今天我试着改变PC,它没有改变语言,不给予任何错误。
我有这个方法来改变AppController中的语言:

public function changeLang():void
    {
        $idioma=$this->request->getCookie('idiomacookie');
        if (I18n::getLocale() !== 'es_ES'){#No esta en español
                I18n::setLocale('es_ES');#Pongo inglés
                $idioma = Cookie::create('idiomacookie', 'es_ES');#Cambio cookie
                $this->response = $this->response->withCookie($idioma);
                $this->idiomacookie = 'es_ES';

            }else{

                I18n::setLocale('en_US');
                $idioma = Cookie::create('idiomacookie', 'en_US');

                $this->response = $this->response->withCookie($idioma);
                $this->idiomacookie = 'en_US';
        }
        $this->redirect($this->referer());
        
    }

在initialize方法中,我初始化了语言:

public function initialize(): void
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');
        $this->loadComponent('Flash');
        $this->loadComponent('Authentication.Authentication');
        $idioma=$this->request->getCookie('idiomacookie');
        if ($idioma == 'en_US'||$idioma ==NULL){
           I18n::setLocale('en_US');

        }else{
            I18n::setLocale('es_ES');
        }

我使用了var_dumps,它显示当我点击按钮更改语言时,I18n::getLocale()发生了变化,但消息没有变化。
我尝试了从es_ES到en_US的defaultlocale,消息也没有改变。我有这样的翻译文件夹:

/app
 /resources
  /locale
    /en
      default.po
  cake.pot
  default.pot

消息始终以西班牙语(es_ES)显示。我还尝试使用以下命令再次生成文件夹:

bin/cake i18n extract

但这也没用。
有人能告诉我我做错了什么吗?拜托

oiopk7p5

oiopk7p51#

尝试:
// AppController::changeLang()

public function changeLang($language)
{
    $redirect = $this->getRequest()->getQuery('redirect');

    if (in_array($language, ['es_ES', 'en_US'])) {
        $expiry = new FrozenTime('+ 1 year');
        $this->setResponse($this->getResponse()->withCookie(new Cookie('setLanguage', $language, $expiry, null, null, true, true, 'Lax')));
    }


    return $this->redirect($redirect);
}

AppController::beforeFilter()

public function beforeFilter(EventInterface $event)
{
    parent::beforeFilter($event);

    $this->Authentication->addUnauthenticatedActions([
        'changeLang',
        ]);

    $acceptLanguage = $this->getRequest()->getHeaderLine('Accept-Language');
    $getCookie = $this->getRequest()->getCookie('setLanguage');
    $acceptCookie = in_array($getCookie, ['es_ES', 'en_US']);
    $setLanguage = $acceptCookie ? $getCookie : (substr($acceptLanguage, 0, 2) == 'es' ? 'es_ES' : 'en_US');
    I18n::setLocale($setLanguage);

}

相关问题