关于核心翻译行为 (i18n)

我开始使用核心翻译行为。我发现如果我添加一条记录,它只会在一种语言中添加。我不知道其他人如何在同一时间为其他语言在 i18m 表中创建记录。我所做的是对 TranslateBehavior 的 afterSave 进行了一点小修改,因此如果记录是 $created 的,它将在我在 core.php 中定义的所有语言中创建。

我在 core.php 中定义了我的应用程序中使用到的所有语言,如下所示:

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

因此,可以轻松地将它们添加到选择框中并选择语言。

首先,我将 translate.php 从 CakePHP 核心文件复制到 APP/models/behavior 目录中。

然后,对 translate.php 的 afterSave 方法进行如下更改:

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']);
}

我还没有尝试过很多次,但我认为它可以正常工作。请告诉我是否有更好的方法来实现它……或者如果您遇到任何问题……