我试图在模型上创建一些翻译行为。但是我如何删除特定的翻译。
我的示例是具有应翻译名称的类别。可以说我有英文和西班牙文的翻译。我如何删除西班牙语翻译?我可以创建自己的 sql 查询,但是有 cakephp 方法可以做到这一点。
我试图在模型上创建一些翻译行为。但是我如何删除特定的翻译。
我的示例是具有应翻译名称的类别。可以说我有英文和西班牙文的翻译。我如何删除西班牙语翻译?我可以创建自己的 sql 查询,但是有 cakephp 方法可以做到这一点。
但是,它很容易实现
删除给定语言环境的所有翻译(与任何破坏性操作一样 -在执行任何操作之前进行数据库备份,以便在出现错误或意外删除某些内容时可以恢复):
DELETE FROM i18n WHERE locale = 'esp';
当然,语言环境取决于您的特定应用程序 - 您可以检查您的配置,或者只是询问数据库:
SELECT DISTINCT(locale) FROM i18n;
只需添加一个模型条件:
DELETE FROM i18n
WHERE
locale = 'esp' AND
model = 'Category'
;
你需要知道你要操作的记录的id,然后:
DELETE FROM i18n
WHERE
locale = 'esp' AND
model = 'Category' AND
foreign_key = 2468789 AND
field = 'name'
;
如果您不确定直接在数据库上运行查询,请先运行 select 以查看要删除的内容:
SELECT * FROM i18n
WHERE
locale = 'esp' AND
model = 'Category' AND
foreign_key = 2468789 AND
field = 'name'
;
即找到你想要的,然后简单地将 更改SELECT
为DELETE
语句。
令人惊讶的是,没有这样的原生 CakePHP 方法可以删除给定实体的任何翻译。@AD7six 显然是对的,但让我给你一个更“按部就班”的方法。
你可以这样做:
<a href="<?= $this->Url->build(['action' => 'deleteTranslation', 'foreign_key' => 123, 'model' => 'Pluginname.Controller', 'locale' => 'de_DE']); ?>"><?= __('Remove translation'); ?></a>
然后创建一个利用该功能的方法:
//put this into src/AppController.php to enable that functionality across the whole application
public function deleteTranslation() {
$this->loadModel('I18n');
if($this->I18n->deleteAll([
'locale' => $this->request->getQuery('locale'),
'model' => $this->request->getQuery('model'),
'foreign_key' => $this->request->getQuery('foreign_key')
])) {
$this->Flash->success(__('Successfully deleted a translation.'));
}
else {
$this->Flash->error(__('Could not delete a translation.'));
}
return $this->redirect($this->referer());
}