Поведение перевода - еще одна очень полезная, но плохо документированная функция CakePHP. Я реализовал это несколько раз с разумным успехом на многоязычных веб-сайтах по следующим направлениям.
Во-первых, поведение при переводе только интернационализирует содержимое базы данных вашего сайта. Если у вас есть еще статический контент, вам нужно взглянуть на функцию __('string')
Cake и gettext
(здесь есть некоторая полезная информация об этом )
Предполагая, что есть Содержимое, которое мы хотим перевести с помощью следующей таблицы БД:
CREATE TABLE `contents` (
`id` int(11) unsigned NOT NULL auto_increment,
`title` varchar(255) default NULL,
`body` text,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Модель content.php имеет:
var $actsAs = array('Translate' => array('title' => 'titleTranslation',
'body' => 'bodyTranslation'
));
в своем определении. Затем вам нужно добавить таблицу i18n в базу данных следующим образом:
CREATE TABLE `i18n` (
`id` int(10) NOT NULL auto_increment,
`locale` varchar(6) NOT NULL,
`model` varchar(255) NOT NULL,
`foreign_key` int(10) NOT NULL,
`field` varchar(255) NOT NULL,
`content` mediumtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Затем, когда вы сохраняете данные в базе данных на вашем контроллере, установите языковой стандарт на нужный вам язык (этот пример будет для польского):
$this->Content->locale = 'pol';
$result = $this->Content->save($this->data);
Это создаст записи в таблице i18n для полей title и body для локали pol. Поиск найдет, основываясь на текущем языковом стандарте, установленном в браузере пользователя, возвращая массив, например:
[Content]
[id]
[titleTranslation]
[bodyTranslation]
Мы используем превосходный компонент p28n для реализации решения по переключению языков, которое очень хорошо работает с gettext и переводит поведение.
Это не идеальная система - поскольку она создает отношения HABTM на лету, она может вызвать некоторые проблемы с другими отношениями, которые вы, возможно, создали вручную, но если вы будете осторожны, она может работать хорошо.