Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Libraries > [CakePHP] Translate behavior проблема с locale


Автор: linuxoid 29.9.2011, 12:50
Здравствуйте, коллеги. На каке (1.3) такая проблема возникла:

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

Есть 2 кнопочки, которые устанавливают locale : rus и eng

Возьмем простой пример:

- есть таблица - категории (categories)
- У каждой категории 2 поля: id и title
- Соответственно title выносим в categories_translations
- из categories поле title удаляем.

Workflow такой. 

Нажимаем eng. locale в контроллере категорий меняется на eng. Теперь можно создать категорию для eng сайта. Сохраняем и видим, что в списке категорий (admin_index) появилась запись. К примеру

id  title
1   Test category

Проблема в том, что при переключении locale на rus список категорий будет пуст, т.к. видимо работает join и пытается найти в таблице categories_translations соответсвующие записи, которых там еще нет (но на en_us всё OK, т.к. я только что создал категорию с переводом для en_us, поэтому при выборе eng мы что-то видим в списке). Хотелось бы, чтобы на rus список так же бы выводился, даже если еще нету перевода на rus в categories_translations.

Надеюсь, что понятно объяснил, в чем дело. Есть ли какое-то решение без хаков? К примеру можно сначала взять просто все существующие id категорий, затем, если есть перевод для них, присоединить этот перевод и затем составить список. Но это "тяжелый" вариант. Может быть есть какое-то простое решение в рамках каки? Благодарю

Автор: linuxoid 30.9.2011, 09:31
В общем пока остановился на этом солюшне. Не идеальное решение, но для моих задач очень даже подходит (если языки предопределены - rus, eng, spa, т.е. не добавляются динамически) http://www.palivoda.eu/2008/04/i18n-in-cakephp-12-database-content-translation-part-2/

Чтобы можно было сохранять в CMS для разных locale нужно в i18n.php заменить beforeSave() на это (комментарий #7 Georgi Mavrev Says: July 14th, 2008 at 6:25 pm )

Код

function beforeSave(&$model) {
$locale = $this->_getLocale($model);
foreach($this->fields as $modelAlias => $modelFields){
foreach($modelFields as $fieldName=>$asd){
if(empty($model->data[$modelAlias][$fieldName.'_'.$locale])){
if(isset($model->data[$modelAlias][$fieldName])) {
$model->data[$modelAlias][$fieldName.'_'.$locale] = $model->data[$modelAlias][$fieldName];
}
unset($model->data[$modelAlias][$fieldName]);
}
}
}
}


Чтобы поменять язык (комментарий #28 Rostislav Palivoda Says: July 23rd, 2009 at 11:44 pm)

Код

if (!class_exists('I18n')) { uses('i18n');}
&I18n::getInstance()->l10n->get('eng');
 (для PHP5 вместо &I18n пишем I18n)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)