For the Core Translation Behavior (i18n)

I started using the Core Translation Behavior. I discovered that if I added a record, it was only being added in ONE language. I don’t know how other people create the records in the i18m table for the other languages, at the same time. What I did is a little hack on the TranslateBehavior’s afterSave, so if the record was $created it would be created in ALL languages I have defined in my core.php.

I have all the languages used in my App defined in core.php as

Configure::write('Config.languages', array(
    'spa' => __('Español', true),
    'eng' => __('English', true),
));

So it is easy to add them to a selectbox and select the language.

I first copied translate.php from CakePHP core files into my APP/models/behavior directory.

Then, the change in the translate.php afterSave method is as follows:

function afterSave(&$model, $created) {
      if (!isset($this->runtime[$model->alias]['beforeSave'])) {
        return true;
    }

    if ($created) {
        if (!($locales = Configure::read('Config.languages'))) {
            $locale = $this->_getLocale($model);
            $locales = array($locale => $locale);
        }
    } else {
        $locale = $this->_getLocale($model);
        $locales = array($locale => $locale);
    }

    foreach($locales as $locale => $localeName) {
        $tempData = $this->runtime[$model->alias]['beforeSave'];
        $conditions = array('model' => $model->alias, 'foreign_key' => $model->id);
        $RuntimeModel =& $this->translateModel($model);

        foreach ($tempData as $field => $value) {
            unset($conditions['content']);
            $conditions['field'] = $field;
            if (is_array($value)) {
                $conditions['locale'] = array_keys($value);
            } else {
                $conditions['locale'] = $locale;
                if (is_array($locale)) {
                    $value = array($locale[0] => $value);
                } else {
                    $value = array($locale => $value);
                }
            }
            $translations = $RuntimeModel->find('list', array('conditions' => $conditions, 'fields' => array($RuntimeModel->alias . '.locale', $RuntimeModel->alias . '.id')));
            foreach ($value as $_locale => $_value) {
                $RuntimeModel->create();
                $conditions['locale'] = $_locale;
                $conditions['content'] = $_value;
                if (array_key_exists($_locale, $translations)) {
                    $RuntimeModel->save(array($RuntimeModel->alias => array_merge($conditions, array('id' => $translations[$_locale]))));
                } else {
                    $RuntimeModel->save(array($RuntimeModel->alias => $conditions));
                }
            }
        }
    }
    unset($this->runtime[$model->alias]['beforeSave']);
}

I haven’t tried it much yet, but I think it work alright. Please, let me know if there’s a better way to do it… or if you have troubles…