如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.当您那时将语言切换为俄语时,您会看到:
因此您缺少默认语言环境(英语)的值,因为它已被当前所选语言(此处为俄语)的值代替。而且,当您使用其他语言使用该页面时,将无法编辑默认语言环境的值。
我可以忽略一些东西吗,有没有更简便的方法可以使这项工作“开箱即用”?
答案 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');
另请参见