You are here

public function NegotiationBrowserForm::buildForm in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/language/src/Form/NegotiationBrowserForm.php \Drupal\language\Form\NegotiationBrowserForm::buildForm()

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides ConfigFormBase::buildForm

File

core/modules/language/src/Form/NegotiationBrowserForm.php, line 61

Class

NegotiationBrowserForm
Configure the browser language negotiation method for this site.

Namespace

Drupal\language\Form

Code

public function buildForm(array $form, FormStateInterface $form_state) {
  $form = [];

  // Initialize a language list to the ones available, including English.
  $languages = $this->languageManager
    ->getLanguages();
  $existing_languages = [];
  foreach ($languages as $langcode => $language) {
    $existing_languages[$langcode] = $language
      ->getName();
  }

  // If we have no languages available, present the list of predefined languages
  // only. If we do have already added languages, set up two option groups with
  // the list of existing and then predefined languages.
  if (empty($existing_languages)) {
    $language_options = $this->languageManager
      ->getStandardLanguageListWithoutConfigured();
  }
  else {
    $language_options = [
      (string) $this
        ->t('Existing languages') => $existing_languages,
      (string) $this
        ->t('Languages not yet added') => $this->languageManager
        ->getStandardLanguageListWithoutConfigured(),
    ];
  }
  $form['mappings'] = [
    '#type' => 'table',
    '#header' => [
      $this
        ->t('Browser language code'),
      $this
        ->t('Site language'),
      $this
        ->t('Operations'),
    ],
    '#attributes' => [
      'id' => 'language-negotiation-browser',
    ],
    '#empty' => $this
      ->t('No browser language mappings available.'),
  ];
  $mappings = $this
    ->language_get_browser_drupal_langcode_mappings();
  foreach ($mappings as $browser_langcode => $drupal_langcode) {
    $form['mappings'][$browser_langcode] = [
      'browser_langcode' => [
        '#title' => $this
          ->t('Browser language code'),
        '#title_display' => 'invisible',
        '#type' => 'textfield',
        '#default_value' => $browser_langcode,
        '#size' => 20,
        '#required' => TRUE,
      ],
      'drupal_langcode' => [
        '#title' => $this
          ->t('Site language'),
        '#title_display' => 'invisible',
        '#type' => 'select',
        '#options' => $language_options,
        '#default_value' => $drupal_langcode,
        '#required' => TRUE,
      ],
    ];

    // Operations column.
    $form['mappings'][$browser_langcode]['operations'] = [
      '#type' => 'operations',
      '#links' => [],
    ];
    $form['mappings'][$browser_langcode]['operations']['#links']['delete'] = [
      'title' => $this
        ->t('Delete'),
      'url' => Url::fromRoute('language.negotiation_browser_delete', [
        'browser_langcode' => $browser_langcode,
      ]),
    ];
  }

  // Add empty row.
  $form['new_mapping'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Add a new mapping'),
    '#tree' => TRUE,
  ];
  $form['new_mapping']['browser_langcode'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Browser language code'),
    '#description' => $this
      ->t('Use language codes as <a href=":w3ctags">defined by the W3C</a> for interoperability. <em>Examples: "en", "en-gb" and "zh-hant".</em>', [
      ':w3ctags' => 'http://www.w3.org/International/articles/language-tags/',
    ]),
    '#size' => 20,
  ];
  $form['new_mapping']['drupal_langcode'] = [
    '#type' => 'select',
    '#title' => $this
      ->t('Site language'),
    '#options' => $language_options,
  ];
  return parent::buildForm($form, $form_state);
}