CakePHP 3.6 多语言形式
CakePHP 3.6 multi language form
如 中所述,默认语言值应保存在源 table 中,以便它们可以用作其他语言的空字段的后备。
但是我在为此构建表格时遇到问题。我有 5 种语言(语言环境):en_US、nl_BE、fr_BE、de_BE 和 ru_RU。默认区域设置为 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;
这很好用。虽然我不确定这样做是否合适 Cake-way?
但在 VIEW 中(使用禁用的表单)并编辑 defaultLocale 字段
echo $this->Form->control('title');
显示当时所选区域设置的翻译值,而不是保存在源 table 中的 defaultLocale。 F.e。当您当时将语言切换为俄语时,您会看到:
- 英语:Русский титул
- 荷兰语:Nederlandse titel
- 法语:Titre français
- Deutsch:德语标题
- 俄语:Русский титул
所以您缺少默认语言环境(英语)的值,因为它被当前所选语言(此处为俄语)的值所取代。当您使用另一种语言的页面时,您无法编辑默认区域设置的值。
我是不是忽略了什么,有没有更简单的方法来完成这项工作'out of the box'?
您必须确保在默认语言环境中获取记录,而不管当前环境的语言环境如何。您可以使用翻译行为 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');
另见
如
// 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;
这很好用。虽然我不确定这样做是否合适 Cake-way?
但在 VIEW 中(使用禁用的表单)并编辑 defaultLocale 字段
echo $this->Form->control('title');
显示当时所选区域设置的翻译值,而不是保存在源 table 中的 defaultLocale。 F.e。当您当时将语言切换为俄语时,您会看到:
- 英语:Русский титул
- 荷兰语:Nederlandse titel
- 法语:Titre français
- Deutsch:德语标题
- 俄语:Русский титул
所以您缺少默认语言环境(英语)的值,因为它被当前所选语言(此处为俄语)的值所取代。当您使用另一种语言的页面时,您无法编辑默认区域设置的值。
我是不是忽略了什么,有没有更简单的方法来完成这项工作'out of the box'?
您必须确保在默认语言环境中获取记录,而不管当前环境的语言环境如何。您可以使用翻译行为 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');
另见