summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDries2012-09-01 01:49:06 (GMT)
committerDries2012-09-01 01:49:06 (GMT)
commitf82f9df2e191b4e958b4395e4923f93e6ef1fd86 (patch)
treef560a9ede3888a972abde547ac00275c1b58d8c1
parent7564524a567219649ce2d5795b2e4a00b100f914 (diff)
Issue #1738330 by k4v, das-peter, jsbalsera, bforchhammer, Schnitzel: confusing Language negotiation when accessing /.
-rw-r--r--core/includes/install.core.inc5
-rw-r--r--core/modules/language/language.admin.inc8
-rw-r--r--core/modules/language/language.module32
-rw-r--r--core/modules/language/language.negotiation.inc18
-rw-r--r--core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationTest.php42
5 files changed, 66 insertions, 39 deletions
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index c15107c..6c51880 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -1493,6 +1493,11 @@ function install_import_translations(&$install_state) {
language_save($language);
}
+ // If a non-english language was selected, remove English.
+ if ($langcode != 'en') {
+ language_delete('en');
+ }
+
// Collect files to import for this language.
$batch = locale_translate_batch_import_files(array('langcode' => $langcode));
if (!empty($batch)) {
diff --git a/core/modules/language/language.admin.inc b/core/modules/language/language.admin.inc
index b388986..78a95a9 100644
--- a/core/modules/language/language.admin.inc
+++ b/core/modules/language/language.admin.inc
@@ -693,9 +693,10 @@ function language_negotiation_configure_url_form($form, &$form_state) {
$prefixes = language_negotiation_url_prefixes();
$domains = language_negotiation_url_domains();
foreach ($languages as $langcode => $language) {
+ $t_args = array('%language' => $language->name, '%langcode' => $language->langcode);
$form['prefix'][$langcode] = array(
'#type' => 'textfield',
- '#title' => t('%language (%langcode) path prefix', array('%language' => $language->name, '%langcode' => $language->langcode)),
+ '#title' => $language->default ? t('%language (%langcode) path prefix (Default language)', $t_args) : t('%language (%langcode) path prefix', $t_args),
'#maxlength' => 64,
'#default_value' => isset($prefixes[$langcode]) ? $prefixes[$langcode] : '',
'#field_prefix' => $base_url . '/',
@@ -739,6 +740,11 @@ function language_negotiation_configure_url_form_validate($form, &$form_state) {
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.
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index e911980..67c0d6f 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -236,6 +236,10 @@ function language_save($language) {
// Kill the static cache in language_list().
drupal_static_reset('language_list');
+ // Update URL Prefixes for all languages after the new default language is
+ // propagated and the language_list() cache is flushed.
+ language_negotiation_url_prefixes_update();
+
return $language;
}
@@ -457,11 +461,6 @@ function language_language_insert($language) {
language_negotiation_include();
- // Add new language to the list of language prefixes.
- $prefixes = language_negotiation_url_prefixes();
- $prefixes[$language->langcode] = (empty($language->default) ? $language->langcode : '');
- language_negotiation_url_prefixes_save($prefixes);
-
// Add language to the list of language domains.
$domains = language_negotiation_url_domains();
$domains[$language->langcode] = '';
@@ -469,29 +468,6 @@ function language_language_insert($language) {
}
/**
- * Implements hook_language_update().
- */
-function language_language_update($language) {
- if (!empty($language->locked)) {
- return;
- }
-
- language_negotiation_include();
-
- // If the language is the default, then ensure that no other languages have
- // blank prefix codes.
- if (!empty($language->default)) {
- $prefixes = language_negotiation_url_prefixes();
- foreach ($prefixes as $langcode => $prefix) {
- if ($prefix == '' && $langcode != $language->langcode) {
- $prefixes[$langcode] = $langcode;
- }
- }
- language_negotiation_url_prefixes_save($prefixes);
- }
-}
-
-/**
* Implements hook_language_delete().
*/
function language_language_delete($language) {
diff --git a/core/modules/language/language.negotiation.inc b/core/modules/language/language.negotiation.inc
index 549e80a..837cbd2 100644
--- a/core/modules/language/language.negotiation.inc
+++ b/core/modules/language/language.negotiation.inc
@@ -474,6 +474,24 @@ function language_negotiation_url_prefixes() {
}
/**
+ * Update the list of prefixes from the installed languages.
+ */
+function language_negotiation_url_prefixes_update() {
+ $prefixes = language_negotiation_url_prefixes();
+ foreach (language_list() as $language) {
+ // The prefix for this language should be updated if it's not assigned yet
+ // or the prefix is set to the empty string.
+ if (empty($prefixes[$language->langcode])) {
+ // For the default language, set the prefix to the empty string,
+ // otherwise use the langcode.
+ $prefixes[$language->langcode] = !empty($language->default) ? '' : $language->langcode;
+ }
+ // Otherwise we keep the configured prefix.
+ }
+ language_negotiation_url_prefixes_save($prefixes);
+}
+
+/**
* Saves language prefix settings.
*/
function language_negotiation_url_prefixes_save(array $prefixes) {
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationTest.php
index 0372e1b..76af730 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageConfigurationTest.php
@@ -41,40 +41,62 @@ class LanguageConfigurationTest extends WebTestBase {
// Check if the Default English language has no path prefix.
$this->drupalGet('admin/config/regional/language/detection/url');
- $this->assertFieldByXPath('//input[@name="prefix[en]"]', '', t('Default English has no path prefix.'));
+ $this->assertFieldByXPath('//input[@name="prefix[en]"]', '', 'Default English has no path prefix.');
// Add predefined language.
$edit = array(
'predefined_langcode' => 'fr',
);
- $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+ $this->drupalPost('admin/config/regional/language/add', $edit, 'Add language');
$this->assertText('French');
- $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
+ $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
// Check if the Default English language has no path prefix.
$this->drupalGet('admin/config/regional/language/detection/url');
- $this->assertFieldByXPath('//input[@name="prefix[en]"]', '', t('Default English has no path prefix.'));
+ $this->assertFieldByXPath('//input[@name="prefix[en]"]', '', 'Default English has no path prefix.');
// Check if French has a path prefix.
$this->drupalGet('admin/config/regional/language/detection/url');
- $this->assertFieldByXPath('//input[@name="prefix[fr]"]', 'fr', t('French has a path prefix.'));
+ $this->assertFieldByXPath('//input[@name="prefix[fr]"]', 'fr', 'French has a path prefix.');
// Check if we can change the default language.
$this->drupalGet('admin/config/regional/language');
- $this->assertFieldChecked('edit-site-default-en', t('English is the default language.'));
+ $this->assertFieldChecked('edit-site-default-en', 'English is the default language.');
// Change the default language.
$edit = array(
'site_default' => 'fr',
);
$this->drupalPost(NULL, $edit, t('Save configuration'));
- $this->assertNoFieldChecked('edit-site-default-en', t('Default language updated.'));
- $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), t('Correct page redirection.'));
+ $this->assertNoFieldChecked('edit-site-default-en', 'Default language updated.');
+ $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
// Check if a valid language prefix is added afrer changing the default
// language.
$this->drupalGet('admin/config/regional/language/detection/url');
- $this->assertFieldByXPath('//input[@name="prefix[en]"]', 'en', t('A valid path prefix has been added to the previous default language.'));
+ $this->assertFieldByXPath('//input[@name="prefix[en]"]', 'en', 'A valid path prefix has been added to the previous default language.');
// Check if French still has a path prefix.
$this->drupalGet('admin/config/regional/language/detection/url');
- $this->assertFieldByXPath('//input[@name="prefix[fr]"]', 'fr', t('French still has a path prefix.'));
+ $this->assertFieldByXPath('//input[@name="prefix[fr]"]', 'fr', 'French still has a path prefix.');
+
+ // Check that prefix can be changed.
+ $edit = array(
+ 'prefix[fr]' => 'french',
+ );
+ $this->drupalPost(NULL, $edit, t('Save configuration'));
+ $this->assertFieldByXPath('//input[@name="prefix[fr]"]', 'french', 'French path prefix has changed.');
+
+ // Check that prefix of non default langauge cannot be changed to
+ // empty string.
+ $edit = array(
+ 'prefix[en]' => '',
+ );
+ $this->drupalPost(NULL, $edit, t('Save configuration'));
+ $this->assertText(t('The prefix may only be left blank for the default language.'), 'English prefix cannot be changed to empty string.');
+
+ // Check that prefix cannot be changed to contain a slash.
+ $edit = array(
+ 'prefix[en]' => 'foo/bar',
+ );
+ $this->drupalPost(NULL, $edit, t('Save configuration'));
+ $this->assertText(t('The prefix may not contain a slash.'), 'English prefix cannot be changed to contain a slash.');
}
}