function language_negotiation_configure_url_form_validate

Validates the URL language negotiation method configuration.

Validate that the prefixes and domains are unique, and make sure that the prefix and domain are only blank for the default.

File

drupal/core/modules/language/language.admin.inc, line 710
Administration functions for language.module.

Code

function language_negotiation_configure_url_form_validate($form, &$form_state) {
  $languages = language_list();

  // Count repeated values for uniqueness check.
  $count = array_count_values($form_state['values']['prefix']);
  foreach ($languages as $langcode => $language) {
    $value = $form_state['values']['prefix'][$langcode];
    if ($value === '') {
      if (!$language->default && $form_state['values']['language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_PREFIX) {

        // Throw a form error if the prefix is blank for a non-default language,
        // although it is required for selected negotiation type.
        form_error($form['prefix'][$langcode], t('The prefix may only be left blank for the default language.'));
      }
    }
    elseif (strpos($value, '/') !== FALSE) {

      // Throw a form error if the string contains a slash,
      // which would not work.
      form_error($form['prefix'][$langcode], t('The prefix may not contain a slash.'));
    }
    elseif (isset($count[$value]) && $count[$value] > 1) {

      // Throw a form error if there are two languages with the same
      // domain/prefix.
      form_error($form['prefix'][$langcode], t('The prefix for %language, %value, is not unique.', array(
        '%language' => $language->name,
        '%value' => $value,
      )));
    }
  }

  // Count repeated values for uniqueness check.
  $count = array_count_values($form_state['values']['domain']);
  foreach ($languages as $langcode => $language) {
    $value = $form_state['values']['domain'][$langcode];
    if ($value === '') {
      if (!$language->default && $form_state['values']['language_negotiation_url_part'] == LANGUAGE_NEGOTIATION_URL_DOMAIN) {

        // Throw a form error if the domain is blank for a non-default language,
        // although it is required for selected negotiation type.
        form_error($form['domain'][$langcode], t('The domain may only be left blank for the default language.'));
      }
    }
    elseif (isset($count[$value]) && $count[$value] > 1) {

      // Throw a form error if there are two languages with the same
      // domain/domain.
      form_error($form['domain'][$langcode], t('The domain for %language, %value, is not unique.', array(
        '%language' => $language->name,
        '%value' => $value,
      )));
    }
  }

  // Domain names should not contain protocol and/or ports.
  foreach ($languages as $langcode => $name) {
    $value = $form_state['values']['domain'][$langcode];
    if (!empty($value)) {

      // Ensure we have exactly one protocol when checking the hostname.
      $host = 'http://' . str_replace(array(
        'http://',
        'https://',
      ), '', $value);
      if (parse_url($host, PHP_URL_HOST) != $value) {
        form_error($form['domain'][$langcode], t('The domain for %language may only contain the domain name, not a protocol and/or port.', array(
          '%language' => $name,
        )));
      }
    }
  }
}