Я использую 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 ""...
Что-то не так с этим?
Итак, как мы выяснили в комментариях, проблема заключалась в том, что проблемные переводы были помечены как fuzzy
и такие записи не собираются в .mo
файл, если это явно не запрашивается с помощью -f
или же --use-fuzzy
флаг с msgfmt
,
Записи автоматически помечаются как нечеткие, когда .pot
а также po
файлы объединены, и два msgid
строки очень близки, но не совпадают точно, и поскольку эти соответствия могут быть неверными, по умолчанию они не компилируются.
Я должен был увидеть это на вашем скриншоте, который ясно говорит нечеткий на панели инструментов и в строке состояния, и я подозреваю, что записи, помеченные желтоватым оттенком, являются нечеткими, но это было уже очень поздно.
.mo
файлы более .po
файлыНебольшая справочная информация о Cake, хотя (в настоящее время) недокументированная, CakePHP будет использовать .mo
файлы более .po
файлы на случай, если они есть.
Эти скомпилированные двоичные варианты обычно быстрее разбираются (сравните I18n::loadMo()
а также I18n::loadPo()
), поскольку формат проще (без комментариев, ненужных (например, нечетких) переводов, удаленных и т. д.), и можно ожидать, что он будет действительным, и, конечно, .po
файлы могут содержать записи, которые не должны использоваться, например, нечеткие 🙂
Других решений пока нет …