setlocale в Cakephp - PullRequest
       15

setlocale в Cakephp

0 голосов
/ 17 апреля 2019

У меня есть многоязычное веб-приложение в cakephp 2.9, хорошо работающее с его файлами .po, и все, но теперь мне нужно также переводить строки даты и времени, которые, как я знаю, выполняются функцией setlocale. Если я включаю setlocale inline в файл представления, то работает, однако, когда я помещаю его в свою функцию изменения языка (которую я всегда использовал для переключения языков), это не работает.

Мой контроллер языков выглядит следующим образом:

<?php
App::uses('AppController', 'Controller');

class IdiomasController extends AppController {

    var $uses = array();


    public function idioma_spa($u=null) 
    {

        $this->Session->write('Config.language', 'spa');
        setlocale(LC_TIME, array('es_ES.UTF-8', 'esp'));   


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

    public function idioma_eng($u=null) 
    {
        $this->Session->write('Config.language', 'eng');
        setlocale(LC_TIME, array('en_US.UTF-8', 'eng'));   
        $this->redirect($this->referer());
    }

    public function idioma_ita($u=null) 
    {
        $this->Session->write('Config.language', 'ita');
        setlocale(LC_TIME, array('it_IT.UTF-8', 'ita'));

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

И эти функции вызываются в выпадающем меню в панели навигации следующим образом:

            <?php if($this->Session->read('Config.language')=='spa'):?>
                <li class="nav-item dropdown navbar-right">
                    <a class="nav-link dropdown-toggle" href="" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">ES</a>
                    <div class="dropdown-menu">
                        <a class="dropdown-item" href="<?php echo $this->Html->url( array('plugin' => null,'controller'=>'idiomas','action'=>'idioma_eng',$url3)); ?>">EN</a>
                        <a class="dropdown-item" href="<?php echo $this->Html->url( array('plugin' => null,'controller'=>'idiomas','action'=>'idioma_ita',$url3)); ?>">IT</a>
                    </div>
                </li>
            <?php elseif($this->Session->read('Config.language')=='eng'):?>
                <li class="nav-item dropdown navbar-right">
                    <a class="nav-link dropdown-toggle" href="" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">EN</a>
                    <div class="dropdown-menu">
                        <a class="dropdown-item" href="<?php echo $this->Html->url( array('plugin' => null,'controller'=>'idiomas','action'=>'idioma_spa',$url3)); ?>">ES</a>
                        <a class="dropdown-item" href="<?php echo $this->Html->url( array('plugin' => null,'controller'=>'idiomas','action'=>'idioma_ita',$url3)); ?>">IT</a>
                    </div>
                </li>
            <?php elseif($this->Session->read('Config.language')=='ita'):?>
                <li class="nav-item dropdown navbar-right">
                    <a class="nav-link dropdown-toggle" href="" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">IT</a>
                    <div class="dropdown-menu">
                        <a class="dropdown-item" href="<?php echo $this->Html->url( array('plugin' => null,'controller'=>'idiomas','action'=>'idioma_eng',$url3)); ?>">EN</a>
                        <a class="dropdown-item" href="<?php echo $this->Html->url( array('plugin' => null,'controller'=>'idiomas','action'=>'idioma_spa',$url3)); ?>">ES</a>
                    </div>
                </li>
            <?php endif;?>

1 Ответ

0 голосов
/ 18 апреля 2019

хорошо удалось решить это:

класс AppController расширяет контроллер { public $ components = array ('Session');

    public function beforeFilter() {
        if ($this->Session->check('Config.language')) {
        Configure::write('Config.language', $this->Session->read('Config.language'));
        if ($this->Session->read('Config.language')=='spa')
            setlocale(LC_TIME, array('es_ES.UTF-8', 'esp'));
        else if ($this->Session->read('Config.language')=='ita')
            setlocale(LC_TIME, array('it_IT.UTF-8', 'ita'));
        else
            setlocale(LC_TIME, array('en_US.UTF-8', 'eng'));
        }
    }

}

и мой контроллер языков остается просто как:

<?php
App::uses('AppController', 'Controller');

class IdiomasController extends AppController {

    var $uses = array();

    public function idioma_spa($u=null) 
    {
        $this->Session->write('Config.language', 'spa');
        $this->redirect($this->referer());
    }

    public function idioma_eng($u=null) 
    {
        $this->Session->write('Config.language', 'eng');
        $this->redirect($this->referer());
    }

    public function idioma_ita($u=null) 
    {
        $this->Session->write('Config.language', 'ita');
        $this->redirect($this->referer());
    }
}

Не знаю, если это самый эффективный способ, но работает как шарм!

...