«Пролетарии всех стран, объединяйтесь!» — 2010-12-12, purple
Появилась необходимость сделать интернационализацию для моего проекта на CakePHP, и наткнулся я еще на сутки поиска.
На book.cakephp.org, вроде бы, все прекрасно объясняется, все просто как дважды два, но вот некоторых деталей там не было. Описывать, как сделать интернационализацию я не буду, просто скажу, как это сделать легко и быстро, и постараюсь вспомнить грабли, с которыми я столкнулся сам.
Итак, перевод осуществляется с помощью вызова функции __(). Не буду объяснять, как она работает, это можно найти и в кейкбуке, но первая грабля, на которую я наступил - это то, что при вызове этой функции, происходил сразу же вывод строки, переданной ей. Чтобы избежать моментального echo в этой функции, надо передавать параметр 'true' сразу после определения строки: __('string', true). Это приведет к тому, что переведенная строка будет возвращена return'ом, а не echo.
Вторая грабля - невозможность использования функции __() в моделях (валидация), при попытке использовать оную, выдается непонятная ошибка. Точнее, использовать можно, но для этого надо переопределить метод invalidate(). Кстати говоря, это описано в cook book, но, судя по выдаче гугла, вопрос возникает крайне часто. Лично я не стал переопределять метод и попросту в представлении добавил параметр 'error', в котором можно интернационализировать строки без костылей:
Третья частовстречаемая проблема - невозможность интернационализирования строк, больших, чем 1014 символов, и поэтому придется попросту подключать свой шаблон для каждого используемого на сайте языка.
Четвертая проблема возникла при использовании PoEdit. PoEdit - это необходимый редактор для перевода сгенерированного с помощью консольного приложения 'cake i18n extract' .pot файла (в котором как раз и содержится перевод строк). Дело в том, что не удавалось сохранить переведенный файл, PoEdit ругался на какие то две ошибки. В итоге оказалось, что нужно заменить по этой таблице для каждого языка, перейдя по «Каталог - Настройки - Формы множественного числа» две переменные.
Пятая проблема также касается PoEdit. Дело в том, что он создает .mo файл, помимо .po (да - да, сгенерированный кейком .pot надо переименовать в .po, читаем поваренную книгу), который имеет больший приоритет, но он пуст, и при чтении языковой папки, кейк будет читать пустой файл, что неблагополучно скажется на переводе, а, точнее, на его отсутствии. Для фикса, просто удалите .mo файл, он никому не нужен.
Ну и, наконец, шестая проблема. Для тестирования перевода, я пытался использовать следующий код, засунутый в core.php (вроде как должно было бы работать):
На самом деле, такой код в core.php работать не будет, его надо кидать в bootstrap.php, тогда все будет хорошо.
Насколько я помню, это все проблемы, что возникали при простейшей интернационализации приложений на CakePHP. К сожалению, информации в гугле крайне мало по ошибкам, и два потраченных вечера, я думаю, стоят того, чтобы поделиться накопленной информацией со всеми, кто читает сей бложик.
На book.cakephp.org, вроде бы, все прекрасно объясняется, все просто как дважды два, но вот некоторых деталей там не было. Описывать, как сделать интернационализацию я не буду, просто скажу, как это сделать легко и быстро, и постараюсь вспомнить грабли, с которыми я столкнулся сам.
Итак, перевод осуществляется с помощью вызова функции __(). Не буду объяснять, как она работает, это можно найти и в кейкбуке, но первая грабля, на которую я наступил - это то, что при вызове этой функции, происходил сразу же вывод строки, переданной ей. Чтобы избежать моментального echo в этой функции, надо передавать параметр 'true' сразу после определения строки: __('string', true). Это приведет к тому, что переведенная строка будет возвращена return'ом, а не echo.
Вторая грабля - невозможность использования функции __() в моделях (валидация), при попытке использовать оную, выдается непонятная ошибка. Точнее, использовать можно, но для этого надо переопределить метод invalidate(). Кстати говоря, это описано в cook book, но, судя по выдаче гугла, вопрос возникает крайне часто. Лично я не стал переопределять метод и попросту в представлении добавил параметр 'error', в котором можно интернационализировать строки без костылей:
$form->input('login', array(
'size' => '66',
'maxlength' => '32',
'label' => false,
'error' => array(
'notempty' => __('Поле логина не заполнено', true),
'between' => __('Логин должен состоять минимум из 3 символов и не превышать 64 символа', true),
'alphaNumeric' => __('Поле логина должно состоять из латинских/кириллических букв и/или чисел', true),
),
)),
),
Третья частовстречаемая проблема - невозможность интернационализирования строк, больших, чем 1014 символов, и поэтому придется попросту подключать свой шаблон для каждого используемого на сайте языка.
Четвертая проблема возникла при использовании PoEdit. PoEdit - это необходимый редактор для перевода сгенерированного с помощью консольного приложения 'cake i18n extract' .pot файла (в котором как раз и содержится перевод строк). Дело в том, что не удавалось сохранить переведенный файл, PoEdit ругался на какие то две ошибки. В итоге оказалось, что нужно заменить по этой таблице для каждого языка, перейдя по «Каталог - Настройки - Формы множественного числа» две переменные.
Пятая проблема также касается PoEdit. Дело в том, что он создает .mo файл, помимо .po (да - да, сгенерированный кейком .pot надо переименовать в .po, читаем поваренную книгу), который имеет больший приоритет, но он пуст, и при чтении языковой папки, кейк будет читать пустой файл, что неблагополучно скажется на переводе, а, точнее, на его отсутствии. Для фикса, просто удалите .mo файл, он никому не нужен.
Ну и, наконец, шестая проблема. Для тестирования перевода, я пытался использовать следующий код, засунутый в core.php (вроде как должно было бы работать):
Configure::write('Config.language', 'eng');
На самом деле, такой код в core.php работать не будет, его надо кидать в bootstrap.php, тогда все будет хорошо.
Насколько я помню, это все проблемы, что возникали при простейшей интернационализации приложений на CakePHP. К сожалению, информации в гугле крайне мало по ошибкам, и два потраченных вечера, я думаю, стоят того, чтобы поделиться накопленной информацией со всеми, кто читает сей бложик.
Расшарь псто, плес
Новый комментарий
| Имя: | |
| Сайт: | |
|
Текст: |
|
| Капча: | |