diff --git a/i18n_string/i18n_string.inc b/i18n_string/i18n_string.inc
index 38df8c2..33fa444 100644
--- a/i18n_string/i18n_string.inc
+++ b/i18n_string/i18n_string.inc
@@ -166,7 +166,7 @@ class i18n_string_object {
    * Get translation to language from string object
    */
   public function get_translation($langcode) {
-    if (empty($this->translations[$langcode])) {
+    if (!isset($this->translations[$langcode])) {
       $translation = $this->textgroup()->load_translation($this, $langcode);
       if ($translation && isset($translation->translation)) {
         $this->set_translation($translation, $langcode);
@@ -1234,7 +1234,7 @@ class i18n_string_object_wrapper extends i18n_object_wrapper {
    */
   public function translate($langcode, $options = array()) {
     // We may have it already translated. As objects are statically cached, translations are too.
-    if (empty($this->translations[$langcode])) {
+    if (!isset($this->translations[$langcode])) {
       $this->translations[$langcode] = $this->translate_object($langcode, $options);
     }
     return $this->translations[$langcode];
diff --git a/i18n_string/i18n_string.test b/i18n_string/i18n_string.test
index 2b8cd15..f11c756 100644
--- a/i18n_string/i18n_string.test
+++ b/i18n_string/i18n_string.test
@@ -120,6 +120,38 @@ class i18nStringTestCase extends Drupali18nTestCase {
         $this->assertText($string_cache->data['string']);
       }
     }
+
+    // Test that un-translated strings are cached correctly.
+    $textgroup = 'test_cached';
+    $key = 3;
+    $string = self::randomName(100);
+    $name = "$textgroup:item:$key:title";
+    i18n_string_update($name, $string);
+
+    // Generate the cache entry.
+    $string_object = i18n_string_build($name, $string);
+    $langcode = i18n_langcode();
+    $string_object->get_translation($langcode);
+
+    // Destroy the textgroup object to write the cache entry.
+    $textgroup_object = i18n_string_textgroup($textgroup);
+    $textgroup_object->__destruct();
+    $this->assertTrue(cache_get($string_object->get_cid()) !== FALSE, "Cache entry created.");
+    drupal_static_reset('i18n_string_textgroup');
+
+    // Reset the loaded translation variable.
+    variable_del('i18n_loaded_translations');
+    $loaded_translations = variable_get('i18n_loaded_translations', array());
+    $this->verbose(var_export($loaded_translations, TRUE));
+
+    // Rebuild the string.
+    $string_object = i18n_string_build($name, $string);
+    $string_object->get_translation($langcode);
+
+    // Check that the string hasn't been loaded.
+    $loaded_translations = variable_get('i18n_loaded_translations', array());
+    $this->verbose(var_export($loaded_translations, TRUE));
+    $this->assertFalse(isset($loaded_translations['test_cached:item:3:title']), "The untranslated string was correctly cached.");
   }
 
 
diff --git a/tests/i18n_test.module b/tests/i18n_test.module
index 6ece038..9dccc4b 100644
--- a/tests/i18n_test.module
+++ b/tests/i18n_test.module
@@ -40,7 +40,7 @@ function i18n_test_i18n_string_info() {
     'title' => t('Test Cached Strings'),
     'description' => t('Translatable items of a textgroup with caching enabled.'),
     'format' => FALSE, // This group doesn't have strings with format
-    'class' => 'i18n_string_textgroup_cached',
+    'class' => 'i18n_string_textgroup_cached_logged',
   );
   return $groups;
 }
@@ -89,4 +89,13 @@ function i18n_test_menu() {
     'delivery callback' => 'drupal_json_output',
   );
   return $items;
-}
\ No newline at end of file
+}
+
+class i18n_string_textgroup_cached_logged extends i18n_string_textgroup_cached {
+  public static function load_translation($i18nstring, $langcode) {
+    $strings = variable_get('i18n_loaded_translations', array());
+    $strings[$i18nstring->get_name()] = true;
+    variable_set('i18n_loaded_translations', $strings);
+    parent::load_translation($i18nstring, $langcode);
+  }
+}
