Drupal 9 中的字段定义可以翻译:字段标签、字段描述和默认值可以获取每种语言的值。
在 hook_form_alter 中,我需要“复制”一些现有字段,但使用不同的语言。我的流程是:
// force wanted language
$language_manager->setConfigOverrideLanguage($target_language);
\Drupal::service("entity_field.manager")->clearCachedFieldDefinitions();
// getTranslation or addTranslation to the $entity depending on the case
if ($entity->hasTranslation($langcode)) {
$entity = $entity->getTranslation($langcode);
} else {
$entity = $entity->addTranslation($langcode);
}
// get the field
$field_definition = \Drupal\field\Entity\FieldConfig::loadByName($entity_type, $bundle, $field_name);
$form_display = EntityFormDisplay::collectRenderDisplay($entity, 'default');
$items = $entity->get($field_name);
$widget = $form_display->getRenderer($field_name);
$field_form = $widget->form($items, $form, $form_state);
// + restore initial language
// insert field in my $form
$form['my-added-field-name'] = $field_form;
这适用于标签和字段描述(它们被翻译成目标语言)。但是默认值会失败(在节点创建而不是修改的情况下)。好吧,它有时会起作用,但并非总是如此,而且并非在所有情况下都有效。例如,如果我用一种不是默认语言的语言创建新内容,则默认值不会被翻译,并且始终是当前语言。
我尝试了很多东西,例如在 $items 上使用 setLangcode(),执行多个 $entity->getTranslation() 等。查看数据,似乎 $widget 的语言很好(我强制的那个)但是$items 中仍然包含当前语言(即使在使用 setLangcode() 之后)。因此,在调用 $widget->form() 之后,我得到了不好的结果(或者,至少,结果不稳定)。
那么,我错过了什么吗?有没有其他/更好的方法来做到这一点?问候。