diff --git modules/locale/locale.module modules/locale/locale.module
index 9505f72..24e83ab 100644
--- modules/locale/locale.module
+++ modules/locale/locale.module
@@ -634,7 +634,7 @@ function locale($string = NULL, $context = NULL, $langcode = NULL) {
         $locale_t[$langcode] = $cache->data;
       }
       elseif (lock_acquire('locale_cache_' . $langcode)) {
-        // Refresh database stored cache of translations for given language.
+        // Refresh the persistent cache of translations for this language.
         // We only store short strings used in current version, to improve
         // performance and consume less memory.
         $result = db_query("SELECT s.source, s.context, t.translation, t.language FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.textgroup = 'default' AND s.version = :version AND LENGTH(s.source) < :length", array(':language' => $langcode, ':version' => VERSION, ':length' => variable_get('locale_cache_length', 75)));
@@ -647,10 +647,14 @@ function locale($string = NULL, $context = NULL, $langcode = NULL) {
     }
   }
 
-  // If we have the translation cached, skip checking the database
   if (!isset($locale_t[$langcode][$context][$string])) {
-
-    // We do not have this translation cached, so get it from the DB.
+    // The translation is not cached, so consult the database. If the string
+    // is short enough to cache, add it to the list of strings to be cached
+    // at the end of the request in locale_exit(); 
+    if (drupal_strlen($string) < variable_get('locale_cache_length', 75)) { 
+      $locale_t[$langcode]['#write_cache'][$context][$string] = TRUE;
+    }
+    // We do not have this translation cached, so get it from the database.
     $translation = db_query("SELECT s.lid, t.translation, s.version FROM {locales_source} s LEFT JOIN {locales_target} t ON s.lid = t.lid AND t.language = :language WHERE s.source = :source AND s.context = :context AND s.textgroup = 'default'", array(
       ':language' => $langcode,
       ':source' => $string,
@@ -662,14 +666,12 @@ function locale($string = NULL, $context = NULL, $langcode = NULL) {
       $locale_t[$langcode][$context][$string] = (empty($translation->translation) ? TRUE : $translation->translation);
 
       if ($translation->version != VERSION) {
-        // This is the first use of this string under current Drupal version. Save version
-        // and clear cache, to include the string into caching next time. Saved version is
-        // also a string-history information for later pruning of the tables.
+        // This is the first use of this string under current Drupal version. The
+        // saved version also a string-history information for later pruning of the tables.
         db_update('locales_source')
           ->fields(array('version' => VERSION))
           ->condition('lid', $translation->lid)
           ->execute();
-        cache_clear_all('locale:', 'cache', TRUE);
       }
     }
     else {
@@ -684,8 +686,6 @@ function locale($string = NULL, $context = NULL, $langcode = NULL) {
         ))
         ->execute();
       $locale_t[$langcode][$context][$string] = TRUE;
-      // Clear locale cache so this string can be added in a later request.
-      cache_clear_all('locale:', 'cache', TRUE);
     }
   }
 
@@ -693,6 +693,31 @@ function locale($string = NULL, $context = NULL, $langcode = NULL) {
 }
 
 /**
+ * Implements hook_exit().
+ */
+function locale_exit() {
+  $locale_t = &drupal_static('locale', array());
+  foreach ($locale_t as $langcode => $strings) {
+    if (!empty($strings['#write_cache'])) {
+      $cid = 'locale:' . $langcode;
+      $data = array();
+      // Get a fresh version of the locale cache, this ensures that if multiple
+      // requests are setting the cache simultaneously, we will not remove
+      // recently cached entries.
+      if ($cached = cache_get($cid)) {
+        $data = $cached->data;
+      }
+      foreach ($strings['#write_cache'] as $context => $strings) {
+        foreach ($strings as $string => $value) {
+          $data[$context][$string] = $locale_t[$langcode][$context][$string];
+        }
+      }
+      cache_set($cid, $data);
+    }
+  }
+}
+
+/**
  * Reset static variables used by locale().
  */
 function locale_reset() {
