diff --git a/includes/locale.inc b/includes/locale.inc index f667d30..b7d9672 100644 --- a/includes/locale.inc +++ b/includes/locale.inc @@ -207,10 +207,16 @@ function locale_language_from_url($languages) { case LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN: foreach ($languages as $language) { - $host = parse_url($language->domain, PHP_URL_HOST); - if ($host && ($_SERVER['HTTP_HOST'] == $host)) { - $language_url = $language->language; - break; + // Skip check if the language doesn't have a domain. + if ($language->domain) { + // Only compare the domains not the protocols or ports. + // Remove protocol and add http:// so parse_url works + $host = 'http://' . str_replace(array('http://', 'https://'), '', $language->domain); + $host = parse_url($host, PHP_URL_HOST); + if ($_SERVER['HTTP_HOST'] == $host) { + $language_url = $language->language; + break; + } } } break; diff --git a/modules/locale/locale.admin.inc b/modules/locale/locale.admin.inc index 79ec3a1..2413cf4 100644 --- a/modules/locale/locale.admin.inc +++ b/modules/locale/locale.admin.inc @@ -307,7 +307,7 @@ function _locale_languages_common_controls(&$form, $language = NULL) { '#title' => t('Language domain'), '#maxlength' => 128, '#default_value' => @$language->domain, - '#description' => t('URL including protocol to use for this language, if your Detection and selection settings use URL domains. For the default language, this value may be left blank. Modifying this value may break existing URLs. Use with caution in a production environment. Example: Specifying "http://example.de" or "http://de.example.com" as language domains for German results in URLs like "http://example.de/contact" and "http://de.example.com/contact", respectively.'), + '#description' => t('The domain name to use for this language if URL domains are used for Detection and selection. Leave blank for the default language. Changing this value may break existing URLs. Example: Specifying "de.example.com" as language domain for German will result in an URL like "http://de.example.com/contact".'), ); $form['direction'] = array('#type' => 'radios', '#title' => t('Direction'), diff --git a/modules/locale/locale.test b/modules/locale/locale.test index 6dad7e0..425f68c 100644 --- a/modules/locale/locale.test +++ b/modules/locale/locale.test @@ -1900,8 +1900,8 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase { $this->assertResponse(404, "Unknown language path prefix should return 404"); // Setup for domain negotiation, first configure the language to have domain - // URL. - $edit = array('prefix' => '', 'domain' => "http://$language_domain"); + // URL. We use https and a port to make sure that only the domain name is used. + $edit = array('prefix' => '', 'domain' => "https://$language_domain:99"); $this->drupalPost("admin/config/regional/language/edit/$language", $edit, t('Save language')); // Set the site to use domain language negotiation.