Index: includes/locale.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/locale.inc,v
retrieving revision 1.255
diff -u -p -r1.255 locale.inc
--- includes/locale.inc	24 May 2010 07:22:12 -0000	1.255
+++ includes/locale.inc	2 Jun 2010 01:36:59 -0000
@@ -262,7 +262,7 @@ function locale_language_url_rewrite_url
  * Rewrite URLs for the Session language provider.
  */
 function locale_language_url_rewrite_session(&$path, &$options) {
-  static $query_rewrite, $query_param, $query_value;
+  static $default, $cache, $query_rewrite, $query_param, $query_value;
 
   // The following values are not supposed to change during a single page
   // request processing.
@@ -271,9 +271,11 @@ function locale_language_url_rewrite_ses
     if (!$user->uid) {
       $languages = language_list('enabled');
       $languages = $languages[1];
+      $default = language_default()->language;
+      $cache = variable_get('cache', 0);
       $query_param = check_plain(variable_get('locale_language_negotiation_session_param', 'language'));
       $query_value = isset($_GET[$query_param]) ? check_plain($_GET[$query_param]) : NULL;
-      $query_rewrite = isset($languages[$query_value]) && language_negotiation_get_any(LOCALE_LANGUAGE_NEGOTIATION_SESSION);
+      $query_rewrite = isset($languages[$query_value]) && (!$cache || $query_value != $default) && language_negotiation_get_any(LOCALE_LANGUAGE_NEGOTIATION_SESSION);
     }
     else {
       $query_rewrite = FALSE;
@@ -290,6 +292,12 @@ function locale_language_url_rewrite_ses
     if (!isset($options['query'][$query_param])) {
       $options['query'][$query_param] = $query_value;
     }
+    // When page cache is enabled default language switch links do not need the
+    // query string parameter as there is no other possibile fallback than the
+    // default language. 
+    elseif ($cache && $options['query'][$query_param] == $default) {
+      unset($options['query'][$query_param]);
+    }
   }
 }
 
