Интернационализация CakePHP не работает

Я прочитал абсолютно все сообщения SO об интернационализации в CakePHP, и, похоже, у меня ничего не работает. Я использую CakePHP 2.5.1.

В config/bootstrap.php:

//Default language
Configure::write('Config.language', 'spa');

В контроллере/AppController.php:

public $components = array('Session', 'DebugKit.Toolbar');

public function beforeFilter()
{
    //Set the UI lang preference
    if($this->Session->check('Config.language'))
    {
        Configure::write('Config.language', $this->Session->read('Config.language'));
    }
}

Моя файловая структура такова:

/Locale/
   - default.mo
   - default.po
   - default.pot
   - eng/LC_MESSAGES/
       - default.mo
       - default.po

У меня есть ссылки на вид как таковой:

echo '<p class="">' . $this->Html->link('EN', array('controller' => 'users', 'action' => 'lang', 'en')) . '</p>';
echo '<p class="">' . $this->Html->link('ES', array('controller' => 'users', 'action' => 'lang', 'es')) . '</p>';

и мой контроллер Users делает с этим следующее:

public function lang($which)
{
    if($which == "en")
    {
        $this->Session->write('Config.language', 'eng');
    } elseif($which == "es")
    {
        $this->Session->write('Config.language', 'spa');
    } else
    {
        $this->Session->setFlash(_('Unknown language.'), 'flash_red');
    }
    $this->redirect('/');
}

Когда я нажимаю на любую из ссылок (EN или ES), страница перезагружается, но показывает обычный текст.

Любая подсказка о том, что я мог упустить? Или какие-нибудь советы о том, с чего начать отладку кода ядра Cake?

ПД. Журналы ошибок ничего не показывают.

Спасибо!


person Sandy    schedule 07.10.2014    source источник
comment
Первый шаг, удалите кеш (/app/tmp/cache/).   -  person ndm    schedule 07.10.2014
comment
1) Измените config/bootstrap.php, чтобы не иметь переменной конфигурации с именем Config.language для языка по умолчанию: Configure::write('Config.defaultLanguage', 'spa'); 2) Изменить в контроллере/AppController.php if($this-›Session-›check('Config.language')) {Configure::write('Config.language', $this-›Session-›read('Config .language'));} else {Configure::write('Config.language', Configure::read('Config.defaultLanguage'));} 3) Удалить все файлы из /app/tmp/cache/persistent/* .* 4) Проверьте ваши файлы po или используйте poedit 5) Используйте Debug Kit и следуйте значениям сеансов   -  person wappy    schedule 07.10.2014
comment
@ndm Я пытался удалить кеш, но это не помогает.   -  person Sandy    schedule 07.10.2014
comment
@CristianFlorea, где/как я могу проверить свой po-файл?   -  person Sandy    schedule 07.10.2014
comment
@CristianFlorea Используя Debug Kit, переменные сеанса кажутся в порядке. Я вижу >Config, и когда я нажимаю на него, я вижу значение language, которое меняется между eng и spa, когда я нажимаю на разные ссылки. Я также удалил настройку в bootstrap.php и удалил файлы из папки кеша. Все равно не повезло :(   -  person Sandy    schedule 08.10.2014
comment
Если это вообще полезно, я вижу некоторые файлы в /tmp/cache/persistent/, которые заканчиваются на _eng и _spa   -  person Sandy    schedule 08.10.2014
comment
Не спрашивал, но вы повторяете свой текст в CTP следующим образом: ‹?php echo __('hola!'); ?› И в ваших файлах po: /app/Locale/spa/LC_MESSAGES/default.po: #: View/Pages/home.ctp:1 msgid привет! msgstr привет! Просто используйте PO Edit   -  person wappy    schedule 09.10.2014
comment
Попробуйте выполнить все шаги, описанные здесь, и будьте осторожны, используя __('ваш текст'); метод: wpy.me/ ru/блог/   -  person wappy    schedule 09.10.2014


Ответы (1)


Вышеупомянутая ошибка заключается в том, что используется ОДИН символ подчеркивания вместо ДВУХ:

$this->Session->setFlash(_('Unknown language.'), 'flash_red');

должно быть

$this->Session->setFlash(__('Unknown language.'), 'flash_red');

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

person Sandy    schedule 09.10.2014