关于核心翻译行为 (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']);
}
我还没有尝试过很多次,但我认为它可以正常工作。请告诉我是否有更好的方法来实现它……或者如果您遇到任何问题……