Локализация CakePHP отказывается работать

Я использую CakePHP v2.5.6 и следую эта документация по локализации CakePHP. Я прочитал это 100 раз, но это все еще не работает!

Использование торта консоли i18n задача, я создал следующие файлы …

app/Locale/default.pot
app/Locale/fra/LC_MESSAGES/default.po
app/Locale/fra/LC_MESSAGES/default.mo

…Я использовал Poedit для перевода нескольких строк (для тестирования):

введите описание изображения здесь

В bootstrap.php у меня есть:

Configure::write('Config.language', 'fra');

(Я также попытался поместить его в мой AppController’s beforeFilter() что тоже не сработало)

На мой взгляд, я имею:

<?php
Debugger::dump( Configure::read('Config.language') );
Debugger::dump( CakeSession::read('Config.language') );
echo __('Find a Place');
?>

Но когда я загружаю страницу, я просто вижу:

'fra'
null
Find a Place

Зачем?????!!!!!!

Обновление 1
@ndm поднял некоторые опасения по поводу кеширования …

В моем постоянном кэше появляются следующие файлы:

.../temp/cache/persistent/myapp_cake_core_cake_fra
.../temp/cache/persistent/myapp_cake_core_default_fra
.../temp/cache/persistent/myapp_cake_core_file_map
.../temp/cache/persistent/myapp_cake_core_method_cache

Обновление 2
Следуя совету @ ndm, я взломал все, кроме одного перевода в файле .po, и он РАБОТАЛ!

# LANGUAGE translation of CakePHP Application
# Copyright YEAR NAME <EMAIL@ADDRESS>
#
msgid ""msgstr """Project-Id-Version: PROJECT VERSION\n""POT-Creation-Date: 2014-11-20 11:30-0500\n""PO-Revision-Date: 2014-11-20 11:43-0500\n""Last-Translator: SDP\n""Language-Team:  <EMAIL@ADDRESS>\n""Language: fr_CA\n""MIME-Version: 1.0\n""Content-Type: text/plain; charset=UTF-8\n""Content-Transfer-Encoding: 8bit\n""Plural-Forms: nplurals=2; plural=(n > 1);\n""X-Generator: Poedit 1.6.10\n"

#: View/Elements/nav--main.ctp:3
#, fuzzy
msgid "Find a Place"msgstr "Trouver une place"

Очевидно, что-то не так с моим файлом, но это странно, потому что это совершенно новый файл, созданный Poedit, и он без проблем проходит функцию «Проверка». Это просто говорит о том, что есть много записей, которые еще не переведены.

Строки, которые я удалил из файла, выглядят так:

...
#: Controller/FavoritesController.php:38;73;101
msgid "Invalid favorite"msgstr ""
#: Controller/FavoritesController.php:53;77
msgid "The favorite has been saved."msgstr ""
#: Controller/FavoritesController.php:56;80
msgid "The favorite could not be saved. Please, try again."msgstr ""...

Что-то не так с этим?

3

Решение

Нечеткие записи не компилируются

Итак, как мы выяснили в комментариях, проблема заключалась в том, что проблемные переводы были помечены как fuzzyи такие записи не собираются в .mo файл, если это явно не запрашивается с помощью -f или же --use-fuzzy флаг с msgfmt,

Записи автоматически помечаются как нечеткие, когда .pot а также po файлы объединены, и два msgid строки очень близки, но не совпадают точно, и поскольку эти соответствия могут быть неверными, по умолчанию они не компилируются.

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

CakePHP использует .mo файлы более .po файлы

Небольшая справочная информация о Cake, хотя (в настоящее время) недокументированная, CakePHP будет использовать .mo файлы более .po файлы на случай, если они есть.

Эти скомпилированные двоичные варианты обычно быстрее разбираются (сравните I18n::loadMo() а также I18n::loadPo()), поскольку формат проще (без комментариев, ненужных (например, нечетких) переводов, удаленных и т. д.), и можно ожидать, что он будет действительным, и, конечно, .po файлы могут содержать записи, которые не должны использоваться, например, нечеткие 🙂

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]