如何防止显示/接收未翻译的内容?

时间:2016-02-07 20:45:55

标签: cakephp internationalization cakephp-3.0 query-builder

这是我的距离单元

public function display()
{
    $this->loadModel('Distances');
    $distances = $this->Distances->find('all',[
        'order' => 'Distances.id ASC',
    ])->toArray();
    $this->set('distances',$distances);
}}

问题是,如果内容尚未翻译并存储在数据库中,则会在页面上显示原始未翻译的内容。

如何防止这种情况,只显示当前语言的翻译内容?

1 个答案:

答案 0 :(得分:2)

onlyTranslated选项

遗憾的是,尚未记录,但Translate行为支持onlyTranslated选项,这将导致仅找到当前语言环境中存在翻译的记录。

所以它可以像启用该选项一样,在加载行为时的配置中:

$this->addBehavior('Translate', [
      'onlyTranslated' => true,
      // ...
]);

或动态:

$this->Distances->behaviors()->get('Translate')->config('onlyTranslated', true);

但是,这仅在当前区域设置不是默认区域设置时才有效。即,当您切换语言环境以便以其他语言查看您的内容时,在大多数情况下,这正是您想要和需要的!

自定义查询

如果您只想检索存在翻译的记录,无论当前区域设置或翻译的区域设置如何,那么在翻译表上使用INNER联接的自定义查询将是一个选项。

使用Query::innerJoinWith()这应该非常简单。这是一个基本的例子,应该是相当自我解释的:

$TranslateBehavior = $this->Distances->behaviors()->get('Translate');
$translationTable = $TranslateBehavior->config('translationTable');

$distances = $this->Distances
    ->find()
    ->innerJoinWith($translationTable)
    ->order('Distances.id ASC')
    ->toArray();

另见