CakePHP 3.6多语言形式

时间:2018-08-29 06:17:08

标签: forms cakephp multilingual translate

CakePHP 3.6.10 Translate behaviour not showing 'defaultLocale' values中所述,默认语言值应保存在源表中,以便可以用作其他语言中的空字段的备用。 但是,我在为此创建表格时遇到了问题。我有5种语言(语言环境):en_US,nl_BE,fr_BE,de_BE和ru_RU。 defaultLocale为en_US。为了添加新记录,我做了:

// for the defaultLocale
echo $this->Form->control('title');
// for all other languages I iterate over every language except of the defaultLocale
foreach ($supported_locales as $key => $val):
    if ($key !== $default_locale):
        echo $this->Form->control('_translations.' . $key . '.title');
    endif;
endforeach;

这很好。尽管我不确定这是否是正确的选择?

但是在VIEW中(使用禁用的表单)并编辑defaultLocale字段

echo $this->Form->control('title');

显示当时所选语言环境的转换值,而不是保存在源表中的defaultLocale。 F.e.当您那时将语言切换为俄语时,您会看到:

  • 英语:Русскийтитул
  • 荷兰人:荷兰尼德兰兹
  • 法语:法语法语
  • Deutsch:Deutscher Titel
  • 俄语:Русскийтитул

因此您缺少默认语言环境(英语)的值,因为它已被当前所选语言(此处为俄语)的值代替。而且,当您使用其他语言使用该页面时,将无法编辑默认语言环境的值。

我可以忽略一些东西吗,有没有更简便的方法可以使这项工作“开箱即用”?

1 个答案:

答案 0 :(得分:1)

您必须确保无论当前环境的语言环境如何,都以默认语言环境获取记录。您可以使用转换行为setLocale()方法(在CakePHP 3.6之前为locale())来显式设置要用于特定存储库的语言环境,例如:

$locale = \Cake\Core\Configure::read('App.defaultLocale');
$this->Articles->setLocale($locale);
$query = $this->Articles->find('translations');

这将检索在配置的默认语言环境中的文章,而与可能通过I18n::setLocale()设置的内容无关。如果您还包括需要应用语言环境的关联,那么您也必须为它们明确设置语言环境,即:

$this->Articles->setLocale($locale);
$this->Articles->Comments->setLocale($locale);
$query = $this->Articles->find('translations')->contain('Comments');

另请参见