я прав

книга злого кровавого демона

Posts Tagged ‘l10n

Translate Behavior

с 5 комментариями

Незаменимая вещь при разработке многоязычного сайта на CakePHP – translate behavior. Суть его работы в том, что создается виртуальное поле в модели и его содержимое отображается в зависимости от текущей локали.

Чтобы начать использовать сабж нужно создать таблицу интернационализации.

  1. CREATE TABLE i18n (
  2.     id int(10) NOT NULL auto_increment,
  3.     locale varchar(6) NOT NULL,
  4.     model varchar(255) NOT NULL,
  5.     foreign_key int(10) NOT NULL,
  6.     field varchar(255) NOT NULL,
  7.     content mediumtext,
  8.     PRIMARY KEY (id),
  9.     INDEX locale (locale),
  10.     INDEX model (model),
  11.     INDEX row_id (foreign_key),
  12.     INDEX field (field)
  13. );

Дальше в модели (предположим что она называется Dynapage – динамическая страница и содержит поля id, tag) подключим behavior.

  1. <?php
  2. class Dynapage extends AppModel {
  3.     var $name = ‘Dynapage’;
  4.  
  5.     var $actsAs = array(‘Translate’=>array(‘content’, ‘title’));
  6. }
  7. ?>

И вот собственно вся магия. Теперь поля content и title являются полноправными полями модели, Translate будет автоматически отслеживать их использование. При получении записи из базы данных вернутся все поля плюс локаль, то есть в нашем случае (id, tag, content, title, locale).

По умолчанию локаль берется из Configure.language, также ее можно установить вручную.

  1. $this->Dynapage->locale = ‘rus’;

Следует учитывать также, что если локаль установлена таким образом, то Translate ищет только строгое соответствие языка и если поле не локализовано для запрошенного языка, то запись не отобразится вообще.

Вот такой вариант вернет запись вне зависимости от того, локализовано поле или нет (нелокализованные поля будут пустыми).

  1. $this->Dynapage->locale = array(‘rus’);
  2. $this->set(‘dynapage’, $this->Dynapage->read(null, $id));

Если локализуется уже существующая таблица, то не забудьте удалить локализуемые поля из нее, иначе Translate будет некорректно работать.

Написано evilbloodydemon

2009/01/20 в 14:33

Опубликовано в cakephp

Отмечено как , ,

Follow

Get every new post delivered to your Inbox.