Cakephp删除特定语言的翻译

Cakephp删除特定语言的翻译,cakephp,internationalization,Cakephp,Internationalization,我试图在模型上创建一些翻译行为。但是如何删除特定的翻译 我的例子是一个类别,它有一个应该翻译的名称。假设我有英语和西班牙语的翻译。如何删除西班牙语翻译?当然,我可以创建自己的sql查询,但有没有cakephp方法可以做到这一点。没有cake函数可以做到这一点 然而,这很容易实现 删除给定区域设置的所有翻译 要删除给定区域设置的所有翻译(与任何破坏性操作一样-在执行任何操作之前进行db备份,以便在出现错误或删除意外内容时能够恢复): 当然,区域设置取决于您的特定应用程序-您可以检查配置,或者只需询

我试图在模型上创建一些翻译行为。但是如何删除特定的翻译

我的例子是一个类别,它有一个应该翻译的名称。假设我有英语和西班牙语的翻译。如何删除西班牙语翻译?当然,我可以创建自己的sql查询,但有没有cakephp方法可以做到这一点。

没有cake函数可以做到这一点 然而,这很容易实现

删除给定区域设置的所有翻译 要删除给定区域设置的所有翻译(与任何破坏性操作一样-在执行任何操作之前进行db备份,以便在出现错误或删除意外内容时能够恢复):

当然,区域设置取决于您的特定应用程序-您可以检查配置,或者只需询问数据库:

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>

没有一个真正的删除,这样类别就不会显示在西班牙语翻译页面上。好的,谢谢你的帮助。我只是认为有这样的功能,因为它很容易创建和编辑翻译
<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());
}