public function TranslateEditForm::submitForm in Drupal 9
Same name and namespace in other branches
- 8 core/modules/locale/src/Form/TranslateEditForm.php \Drupal\locale\Form\TranslateEditForm::submitForm()
Form submission handler.
Parameters
array $form: An associative array containing the structure of the form.
\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.
Overrides FormInterface::submitForm
File
- core/
modules/ locale/ src/ Form/ TranslateEditForm.php, line 173
Class
- TranslateEditForm
- Defines a translation edit form.
Namespace
Drupal\locale\FormCode
public function submitForm(array &$form, FormStateInterface $form_state) {
$langcode = $form_state
->getValue('langcode');
$updated = [];
// Preload all translations for strings in the form.
$lids = array_keys($form_state
->getValue('strings'));
$existing_translation_objects = [];
foreach ($this->localeStorage
->getTranslations([
'lid' => $lids,
'language' => $langcode,
'translated' => TRUE,
]) as $existing_translation_object) {
$existing_translation_objects[$existing_translation_object->lid] = $existing_translation_object;
}
foreach ($form_state
->getValue('strings') as $lid => $new_translation) {
$existing_translation = isset($existing_translation_objects[$lid]);
// Plural translations are saved in a delimited string. To be able to
// compare the new strings with the existing strings a string in the same
// format is created.
$new_translation_string_delimited = implode(PoItem::DELIMITER, $new_translation['translations']);
// Generate an imploded string without delimiter, to be able to run
// empty() on it.
$new_translation_string = implode('', $new_translation['translations']);
$is_changed = FALSE;
if ($existing_translation && $existing_translation_objects[$lid]->translation != $new_translation_string_delimited) {
// If there is an existing translation in the DB and the new translation
// is not the same as the existing one.
$is_changed = TRUE;
}
elseif (!$existing_translation && !empty($new_translation_string)) {
// Newly entered translation.
$is_changed = TRUE;
}
if ($is_changed) {
// Only update or insert if we have a value to use.
$target = isset($existing_translation_objects[$lid]) ? $existing_translation_objects[$lid] : $this->localeStorage
->createTranslation([
'lid' => $lid,
'language' => $langcode,
]);
$target
->setPlurals($new_translation['translations'])
->setCustomized()
->save();
$updated[] = $target
->getId();
}
if (empty($new_translation_string) && isset($existing_translation_objects[$lid])) {
// Empty new translation entered: remove existing entry from database.
$existing_translation_objects[$lid]
->delete();
$updated[] = $lid;
}
}
$this
->messenger()
->addStatus($this
->t('The strings have been saved.'));
// Keep the user on the current pager page.
$page = $this
->getRequest()->query
->get('page');
if (isset($page)) {
$form_state
->setRedirect('locale.translate_page', [], [
'page' => $page,
]);
}
if ($updated) {
// Clear cache and force refresh of JavaScript translations.
_locale_refresh_translations([
$langcode,
], $updated);
_locale_refresh_configuration([
$langcode,
], $updated);
}
}