Многоязычный cakephp 2.7 перенаправляет язык по умолчанию, если параметр ['language'] не установлен - PullRequest
0 голосов
/ 29 марта 2019

Я создал многоязычный веб-сайт после этого блога и с некоторыми другими исправлениями

На самом деле я хочу перейти на одноязычный веб-сайт на многоязычный веб-сайт. Я хочу перенаправить старые URL-адреса, чтобы исправить обновленные URL-адресакак

Допустим, английский является языком по умолчанию
domain.com должен перейти domain.com/en
domain.com/controller => domain.com/en/controller
domain.com/controller/action => domain.com/en/controller/action
domain.com/controller/action/param1 => domain.com/en/controller/action/param1

Короче говоря, я хочу проверить, не установлен ли правильный язык для перенаправления на тот же URL после добавления языка по умолчанию.

Я попытался перенаправить в методе appController BeforeFilter(), но этоне работают для параметров после действия.он перенаправляет
domain.com/posts/edit/1 => domain.com/posts/edit, пропуская 1
, пока работает нормально для индекса, и добавляет, поскольку у них нет переданных параметров

class AppController extends Controller {

    public $components = array('Cookie','Session');
    public $helpers = array('Html' => array('className' => 'MyHtml'));

    public function beforeFilter() {
          $this->_setLanguage();
          /**************************** This if sttmt is added to redirect to default lang ******/
          if (empty($this->params['language'])) {
                $this->redirect(array('language' => 'en'));
          }
    }

    private function _setLanguage() {
        if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
            $this->Session->write('Config.language', $this->Cookie->read('lang'));
        }
        else if (   isset($this->params['language']) && 
                    ($this->params['language'] !=  $this->Session->read('Config.language'))
                ) {
                    switch( $this->params['language'] ) {
                        case 'fr':
                            $lang = 'fra';
                            break;
                        case 'en':
                        default:
                            $lang = 'eng';
                            break;
                    }
            $this->Session->write('Config.language', $lang);
            $this->Cookie->write('lang', $lang, false, '20 days');
        }else{
            $this->Session->write('Config.language', Configure::read('Config.language'));
            $this->Cookie->write('lang',Configure::read('Config.language'), false, '20 days');
        }
    }

    //override redirect
    public function redirect( $url, $status = NULL, $exit = true ) {
        if (!isset($url['language']) && $this->Session->check('Config.language')) {
            $url['language'] = $this->Session->read('Config.language');
        }
        parent::redirect($url,$status,$exit);
    }
}

// Routes.php

Router::connect('/', array('controller' => 'posts', 'action' => 'index', 'home'));   
Router::connect('/:language/:controller/:action/*', array(), array('language' => 'en|fra'));
Router::connect('/:language/:controller', array('action' => 'index'), array('language' => 'en|fra'));
Router::connect('/:language', array('controller' => 'posts', 'action' => 'index'), array('language' => 'en|fra')) ;   

или, если есть другой альтернативный и оптимизированный метод, может быть в Routes.php

...