如何使用CakePHP 3 TranslateBehavior删除翻译

时间:2019-05-30 11:01:34

标签: cakephp internationalization translate

我正在使用TranslateBehavior,并且效果很好。但是,存在删除翻译的问题。 我有一个问题,如果i18n表中存在空字符串,则返回空字符串,这很有意义。我设置

allowEmptyTranslations => false

flag,它解决了问题,但又创建了另一个。我现在无法删除翻译。我尝试将字段留空或节省单个空间。第一种技术根本不更改任何字段,另一种确实保存了,但是后来我无法将空间更改为其他任何内容。如果我尝试输入新值,则会直接从数据库中得到重复的行错误,因此,我假设如果只有一个空格,则未设置实际字段(Translate必须将其视为空)。因此,似乎allowEmptyTranslations可同时用于保存和检索。

简而言之,有人知道删除翻译的方法吗?

1 个答案:

答案 0 :(得分:0)

我注意到您的重复行错误问题是关于什么的,但是如果您想实际保存空字符串(或null),则必须启用allowEmptyTranslations,如果需要,可以立即执行此操作。

这是一个简单而肮脏的示例,其中$table是附加了翻译行为的表对象,而$entity是您要为其保存翻译的实体:

// ...

$translateBehavior = $table->behaviors()->get('Translate');
$allowEmptyTranslations = $translateBehavior->getConfig('allowEmptyTranslations');
$translateBehavior->setConfig('allowEmptyTranslations', true);

$result = $table->save($entity);
// ...

$translateBehavior->setConfig('allowEmptyTranslations', $allowEmptyTranslations);

或者,您也可以删除翻译条目,这里$entity是您要为其删除翻译的实体,假设它属于名为ArticlesTable的表类,并且您d要删除title字段的法语翻译:

$translateBehavior = $table->behaviors()->get('Translate');
$translationTable = $translateBehavior->getTableLocator()->get(
    $translateBehavior->getConfig('translationTable')
);

$translationEntity = $translationTable
    ->find()
    ->where([
        'foreign_key' => $entity->id,
        'model' => 'Articles',
        'field' => 'title',
        'locale' => 'fr_FR',
    ])
    ->firstOrFail();

$result = $translationTable->delete($translationEntity);

示例未经测试,但您明白了。