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);
  }
}