You are here

public function TranslationStatusForm::buildForm in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/locale/src/Form/TranslationStatusForm.php \Drupal\locale\Form\TranslationStatusForm::buildForm()
  2. 10 core/modules/locale/src/Form/TranslationStatusForm.php \Drupal\locale\Form\TranslationStatusForm::buildForm()

Form builder for displaying the current translation status.

Overrides FormInterface::buildForm

File

core/modules/locale/src/Form/TranslationStatusForm.php, line 68

Class

TranslationStatusForm
Provides a translation status form.

Namespace

Drupal\locale\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $languages = locale_translatable_language_list();
  $status = locale_translation_get_status();
  $options = [];
  $languages_update = [];
  $languages_not_found = [];
  $projects_update = [];

  // Prepare information about projects which have available translation
  // updates.
  if ($languages && $status) {
    $updates = $this
      ->prepareUpdateData($status);

    // Build data options for the select table.
    foreach ($updates as $langcode => $update) {
      $title = $languages[$langcode]
        ->getName();
      $locale_translation_update_info = [
        '#theme' => 'locale_translation_update_info',
      ];
      foreach ([
        'updates',
        'not_found',
      ] as $update_status) {
        if (isset($update[$update_status])) {
          $locale_translation_update_info['#' . $update_status] = $update[$update_status];
        }
      }
      $options[$langcode] = [
        'title' => [
          'data' => [
            '#title' => $title,
            '#plain_text' => $title,
          ],
        ],
        'status' => [
          'class' => [
            'description',
            'priority-low',
          ],
          'data' => $locale_translation_update_info,
        ],
      ];
      if (!empty($update['not_found'])) {
        $languages_not_found[$langcode] = $langcode;
      }
      if (!empty($update['updates'])) {
        $languages_update[$langcode] = $langcode;
      }
    }

    // Sort the table data on language name.
    uasort($options, function ($a, $b) {
      return strcasecmp($a['title']['data']['#title'], $b['title']['data']['#title']);
    });
    $languages_not_found = array_diff($languages_not_found, $languages_update);
  }
  $last_checked = $this->state
    ->get('locale.translation_last_checked');
  $form['last_checked'] = [
    '#theme' => 'locale_translation_last_check',
    '#last' => $last_checked,
  ];
  $header = [
    'title' => [
      'data' => $this
        ->t('Language'),
      'class' => [
        'title',
      ],
    ],
    'status' => [
      'data' => $this
        ->t('Status'),
      'class' => [
        'status',
        'priority-low',
      ],
    ],
  ];
  if (!$languages) {
    $empty = $this
      ->t('No translatable languages available. <a href=":add_language">Add a language</a> first.', [
      ':add_language' => Url::fromRoute('entity.configurable_language.collection')
        ->toString(),
    ]);
  }
  elseif ($status) {
    $empty = $this
      ->t('All translations up to date.');
  }
  else {
    $empty = $this
      ->t('No translation status available. <a href=":check">Check manually</a>.', [
      ':check' => Url::fromRoute('locale.check_translation')
        ->toString(),
    ]);
  }

  // The projects which require an update. Used by the _submit callback.
  $form['projects_update'] = [
    '#type' => 'value',
    '#value' => $projects_update,
  ];
  $form['langcodes'] = [
    '#type' => 'tableselect',
    '#header' => $header,
    '#options' => $options,
    '#default_value' => $languages_update,
    '#empty' => $empty,
    '#js_select' => TRUE,
    '#multiple' => TRUE,
    '#required' => TRUE,
    '#not_found' => $languages_not_found,
    '#after_build' => [
      'locale_translation_language_table',
    ],
  ];
  $form['#attached']['library'][] = 'locale/drupal.locale.admin';
  $form['actions'] = [
    '#type' => 'actions',
  ];
  if ($languages_update) {
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Update translations'),
    ];
  }
  return $form;
}