CakePHP динамически меняет локаль

Я интернационализировал свое приложение CakePHP с помощью .po файлов.

Структура файла следующая:

- src
   - Locale
      - en_EN
      - en_ES

Приложение корректно переводится при запуске:

ini_set('intl.default_locale', 'en_ES');

Но мне нужно, чтобы приложение переводилось динамически, например, в кнопке прослушивателя действий.

Я пробовал следующее, но это не работает:

use Cake\I18n\I18n;
I18n::locale('en_EN');

person Wildchild    schedule 20.01.2016    source источник
comment
см. stackoverflow.com /вопросы/28847597/   -  person N Nem    schedule 20.01.2016
comment
не работает не является правильным описанием проблемы. Уточните, что именно происходит в какой ситуации, и добавьте соответствующий контекст кода.   -  person ndm    schedule 20.01.2016
comment
Проблема в том, что когда я использую I18n::locale('en_EN'); на контроллере, я переводю язык только в этом контроллере, а не во всем приложении. Моя идея состоит в том, чтобы поместить кнопку или ссылку на панель навигации, которая позволяет переводить язык при нажатии.   -  person Wildchild    schedule 21.01.2016


Ответы (1)


Вам нужно сохранить локаль в сеансе, чтобы она сохранялась между запросами страниц.

Возможный подход:

class AppController extends Controller {    

    public function initialize() {

        if ($this->request->session()->check('Config.locale')) {    
            I18n::locale($this->request->session()->read('Config.locale'));
        }

        //rest of your init code
    }


    public function change_locale($locale){

        $this->request->session()->write('Config.locale', $locale);
        return $this->redirect($this->referer());
    }    

}
person Inigo Flores    schedule 20.01.2016
comment
Я получаю эту ошибку, когда помещаю этот код в свой AppController: Вызов функции-члена check() для не-объекта - person Wildchild; 21.01.2016
comment
Исправлена ​​опечатка. Пожалуйста, попробуйте прямо сейчас. - person Inigo Flores; 21.01.2016
comment
Это работает, но это решение дает мне ошибки в шаблоне, где я использую ajax для вызова действия контроллера.. :( - person Wildchild; 21.01.2016
comment
Если вы меняете язык через ajax, вам не нужно вызывать return $this->redirect($this->referer()). Вместо этого принудительно перезагрузите страницу из Javascript после завершения вызова ajax. - person Inigo Flores; 21.01.2016