Index: preserve_language.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/preserve_language/preserve_language.admin.inc,v
retrieving revision 1.1
diff -u -r1.1 preserve_language.admin.inc
--- preserve_language.admin.inc	31 Oct 2008 09:55:28 -0000	1.1
+++ preserve_language.admin.inc	13 Nov 2008 13:50:59 -0000
@@ -2,16 +2,16 @@
 // $Id;$
 
 /**
- * Admin page
+ * Admin settings form
  */
-function _preserve_language_admin() {
+function preserve_language_admin_form() {
   $form = array();
+
   $form['preserve_language_on'] = array(
     '#type' => 'checkbox',
     '#title' => t('Preserve interface language on language links'),
     '#default_value' => variable_get('preserve_language_on', 1),
     '#description' => t("This will alter all links to translations such that they do not change the interface language when changing the content language"),
-    '#required' => TRUE,
   );
 
   $form['preserve_language_content_neutral'] = array(
@@ -26,7 +26,6 @@
     '#title' => t('Interface language switcher block'),
     '#default_value' => variable_get('preserve_language_block', 1),
     '#description' => t("Provides an interface language switcher block. This only switches the language of the interface (when i18n is installed, the local language switcher block changes both interface and content language)"),
-    '#required' => TRUE,
   );
 
   if (module_exists('i18n')) {
@@ -37,5 +36,30 @@
       '#description' => t('i18n overrides the content mode selection when viewing node pages. This option reverts this behaviour, and forces the content mode selection to off. In the context of Preserve language, this is added so that all menu items show regardless of the content language (see this issue http://drupal.org/node/283839 ). However, it will have other side effects ; use with caution.'),
     );
   }
+  
+  $form['default_lang_prefix'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Default language redirect'),
+    '#description' => t("Allow url path rewriting for default language: if default language haven't a path-prefix setted and user is accessing content with default-lang code, redirect it to the right path instead of return 'Not Found' page."),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+  );
+
+  $form['default_lang_prefix']['preserve_language_default_lang_prefix_redirect'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable redirect default language'),    
+    '#default_value' => variable_get('preserve_language_default_lang_prefix_redirect', 0),
+    '#disabled' => !_preserve_language_enable_default_lang_prefix_redirect(), 
+  );
+  
+  $form['default_lang_prefix']['preserve_language_default_lang_prefix_redirect_code'] = array(
+    '#type' => 'radios',
+    '#title' => t('Redirect HTTP code'),
+    '#description' => t('Setting for redirect mode: use HTTP/301 if resource have been assigned a new permanent URI; use HTTP/302 if requested resource resides temporarily under a different URI.'),
+    '#default_value' => variable_get('preserve_language_default_lang_prefix_redirect_code', 301),
+    '#options' => array(301 => t('HTTP/301 Code'), 302 => t('HTTP/302 Code')),
+    '#disabled' => !_preserve_language_enable_default_lang_prefix_redirect(),
+  );
+
   return system_settings_form($form);
 }
Index: preserve_language.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/preserve_language/preserve_language.install,v
retrieving revision 1.2
diff -u -r1.2 preserve_language.install
--- preserve_language.install	31 Oct 2008 09:55:28 -0000	1.2
+++ preserve_language.install	13 Nov 2008 13:25:26 -0000
@@ -18,4 +18,17 @@
   
   db_query("UPDATE {system} SET weight = $weight WHERE name = 'preserve_language'");
 }
+
+/**
+ * hook_uninstall()
+ */
+function preserve_language_uninstall() {
+  // Cleaning variables
+  variable_del('preserve_language_on');
+  variable_del('preserve_language_selection');
+  variable_del('preserve_language_content_neutral');
+  variable_del('preserve_language_block');
+  variable_del('preserve_language_default_lang_prefix_redirect');
+  variable_del('preserve_language_default_lang_prefix_redirect_code');
+}
 ?>
Index: preserve_language.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/preserve_language/preserve_language.module,v
retrieving revision 1.5
diff -u -r1.5 preserve_language.module
--- preserve_language.module	10 Nov 2008 11:27:19 -0000	1.5
+++ preserve_language.module	13 Nov 2008 13:53:49 -0000
@@ -33,6 +33,17 @@
   }
 }
 
+function _preserve_language_enable_default_lang_prefix_redirect($reset = FALSE) {
+  static $enable;
+  
+  if($reset || !isset($enabled)) {
+    $language = language_default();
+    $lang_negotiation = variable_get('language_negotiation', LANGUAGE_NEGOTIATION_NONE);
+    $enabled = $language->prefix == '' && ($lang_negotiation == LANGUAGE_NEGOTIATION_PATH_DEFAULT || $lang_negotiation == LANGUAGE_NEGOTIATION_PATH);
+  }
+
+  return $enable;
+}
 
 /**
  * Implementation of hook_init
@@ -44,8 +55,29 @@
       i18n_selection_mode('off');
     }
   }
-}
 
+  /**
+   * Adding a default-redirect for default language (without path-prefix)
+   * code taken and adapted from language.inc and Localizer module
+   */
+  if (_preserve_language_enable_default_lang_prefix_redirect() && variable_get('preserve_language_default_lang_prefix_redirect', 0) == 1) {
+    $language = language_default();
+    
+    // $_GET['q'] might not be available at this time, because
+    // path initialization runs after the language bootstrap phase.
+    $args = isset($_GET['q']) ? explode('/', $_GET['q']) : array();
+    $prefix = array_shift($args);
+
+    if ($prefix == $language->language) {
+      $path = implode('/', $args);
+      $destination = url($path, array('absolute' => TRUE));
+      module_invoke_all('exit', $destination);
+      session_write_close();
+      header('Location: '. $destination, TRUE, variable_get('preserve_language_default_lang_prefix_redirect_code', 301));
+      exit();
+    }
+  }
+}
 
 /**
  * Implementation of hook_link_alter
@@ -74,7 +106,7 @@
     'title' => 'Preserve language',
     'description' => 'Settings for preserve language',
     'page callback' => 'drupal_get_form',
-    'page arguments' => array('_preserve_language_admin'),
+    'page arguments' => array('preserve_language_admin_form'),
     'access arguments' => array('administer preserve language'),
     'type' => MENU_NORMAL_ITEM,
     'file' => 'preserve_language.admin.inc',

