diff --git a/search_api_saved_searches.module b/search_api_saved_searches.module
index 45ab705..601e535 100644
--- a/search_api_saved_searches.module
+++ b/search_api_saved_searches.module
@@ -618,10 +618,11 @@ function search_api_saved_searches_save_form(array $form, array &$form_state, Se
   }
   $form_state['settings'] = $settings;
 
-  if (!empty($settings->options['description'])) {
+  $description = $settings->getTranslatedOption('description');
+  if (!empty($description)) {
     $form['description'] = array(
       '#type' => 'item',
-      '#description' => _filter_autop(check_plain($settings->options['description'])),
+      '#description' => _filter_autop(check_plain($description)),
     );
   }
 
@@ -675,7 +676,7 @@ function search_api_saved_searches_save_form(array $form, array &$form_state, Se
     $form['notify_interval'] = array(
       '#type' => 'select',
       '#title' => t('Notification interval'),
-      '#options' => $settings->options['interval_options'],
+      '#options' => $settings->getTranslatedOption('interval_options'),
       '#required' => TRUE,
     );
   }
@@ -943,9 +944,9 @@ function search_api_saved_searches_mail($key, array &$message, array $params) {
           'results' => array(),
         ),
       );
-      $title = $settings->options['mail']['activate']['title'];
+      $title = $settings->getTranslatedOption('mail.activate.title', $language->language);
       $message['subject'] .= token_replace($title, $data, array('language' => $language, 'sanitize' => FALSE));
-      $body = $settings->options['mail']['activate']['body'];
+      $body = $settings->getTranslatedOption('mail.activate.body', $language->language);
       $message['body'][] = token_replace($body, $data, array('language' => $language, 'sanitize' => FALSE));
       break;
 
@@ -955,9 +956,9 @@ function search_api_saved_searches_mail($key, array &$message, array $params) {
         'user' => $params['user'],
         'search_api_saved_searches' => $params['searches'],
       );
-      $title = $settings->options['mail']['notify']['title'];
+      $title = $settings->getTranslatedOption('mail.notify.title', $language->language);
       $message['subject'] .= token_replace($title, $data, array('language' => $language, 'sanitize' => FALSE));
-      $body = $settings->options['mail']['notify']['body'];
+      $body = $settings->getTranslatedOption('mail.notify.body', $language->language);
       $message['body'][] = token_replace($body, $data, array('language' => $language, 'sanitize' => FALSE));
       break;
   }
diff --git a/search_api_saved_searches.settings_entity.inc b/search_api_saved_searches.settings_entity.inc
index 0a74908..24f6bff 100644
--- a/search_api_saved_searches.settings_entity.inc
+++ b/search_api_saved_searches.settings_entity.inc
@@ -69,4 +69,38 @@ class SearchApiSavedSearchesSettings extends Entity {
     return $this->index;
   }
 
+  /**
+   * Gets the translated value of an option via i18n string translations.
+   *
+   * @param $property
+   *   The name of the property stored in the options, as declared for i18n;
+   *   e.g. "mail.notify.title".
+   * @param $langcode
+   *   (optional) The language code of the language to which the value should
+   *   be translated. If set to NULL, the default display language is being
+   *   used.
+   *
+   * @return
+   *   The raw, translated property value; or the raw, un-translated value if no
+   *   translation is available.
+   *
+   * @see SearchApiSavedSearchesSettingsI18nController
+   */
+  public function getTranslatedOption($property, $langcode = NULL) {
+    $value = drupal_array_get_nested_value($this->options, explode('.', $property));
+    if (isset($value) && module_exists('search_api_saved_searches_i18n') && function_exists('i18n_string')) {
+      $name = 'search_api_saved_searches:search_api_saved_searches_settings:' . $this->identifier() . ':' . $property;
+      if (is_array($value)) {
+        // Handle arrays of values, i.e. interval_options.
+        foreach ($value as $key => $data) {
+          $value[$key] = i18n_string($name . ".$key", $data, array('langcode' => $langcode, 'sanitize' => FALSE));
+        }
+        return $value;
+      }
+      else {
+        return i18n_string($name, $value, array('langcode' => $langcode, 'sanitize' => FALSE));
+      }
+    }
+    return $value;
+  }
 }
diff --git a/search_api_saved_searches.tokens.inc b/search_api_saved_searches.tokens.inc
index 83ce699..0a55d30 100644
--- a/search_api_saved_searches.tokens.inc
+++ b/search_api_saved_searches.tokens.inc
@@ -158,7 +158,7 @@ function search_api_saved_searches_tokens($type, array $tokens, array $data = ar
             if (empty($settings->options['mail']['notify']['results'])) {
               continue;
             }
-            $text = $settings->options['mail']['notify']['results'];
+            $text = $settings->getTranslatedOption('mail.notify.results', $language_code);
             $params['user'] = $search->user();
             $params['search_api_saved_search_info'] = $info;
             $results[] = token_replace($text, $params, $options);
@@ -200,11 +200,11 @@ function search_api_saved_searches_tokens($type, array $tokens, array $data = ar
               if (!empty($data['search_api_saved_search_info']['results'])) {
                 $results = array();
                 $settings = $search->settings();
-                if (empty($settings->options['mail']['notify']['result'])) {
+                $text = $settings->getTranslatedOption('mail.notify.result', $language_code);
+                if (empty($text)) {
                   break;
                 }
                 $item_type = $search->index()->item_type;
-                $text = $settings->options['mail']['notify']['result'];
                 foreach ($data['search_api_saved_search_info']['results'] as $item) {
                   $params = array(
                     $item_type => $item,
diff --git a/search_api_saved_searches_i18n/search_api_saved_searches_i18n.controller.inc b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.controller.inc
new file mode 100644
index 0000000..8ad7ed0
--- /dev/null
+++ b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.controller.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains the SearchApiSavedSearchesSettingsI18nStringObjectWrapper class.
+ */
+
+/**
+ * Customized i18n string integration controller.
+ */
+class SearchApiSavedSearchesSettingsI18nController extends EntityDefaultI18nStringController {
+
+  /**
+   * Overriddes EntityDefaultI18nStringController::hook_object_info() to include a custom object wrapper.
+   */
+  public function hook_object_info() {
+    $info = parent::hook_object_info();
+    $info['search_api_saved_searches_settings']['class'] = 'SearchApiSavedSearchesSettingsI18nStringObjectWrapper';
+    return $info;
+  }
+
+  /**
+   * Overrides EntityDefaultI18nStringController::translatableProperties() to define our custom ones.
+   */
+  protected function translatableProperties() {
+    $properties = array();
+    $properties['description'] = t('Description');
+    $properties['mail.activate.title'] = t('Activation mail, subject');
+    $properties['mail.activate.body'] = t('Activation mail, body');
+    $properties['mail.notify.title'] = t('Notification mail, subject');
+    $properties['mail.notify.body'] = t('Notification mail, body');
+    $properties['mail.notify.results'] = t('Notification mail, results replacement');
+    $properties['mail.notify.result'] = t('Notification mail, result item replacement');
+    return $properties;
+  }
+
+}
diff --git a/search_api_saved_searches_i18n/search_api_saved_searches_i18n.info b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.info
new file mode 100644
index 0000000..c1f4483
--- /dev/null
+++ b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.info
@@ -0,0 +1,9 @@
+name = Search API saved searches translation
+description = Translate Search API saved searches settings.
+dependencies[] = search_api_saved_searches
+dependencies[] = i18n_string
+core = 7.x
+package = Multilingual - Internationalization
+
+files[] = search_api_saved_searches_i18n.controller.inc
+files[] = search_api_saved_searches_i18n.string_wrapper.inc
diff --git a/search_api_saved_searches_i18n/search_api_saved_searches_i18n.module b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.module
new file mode 100644
index 0000000..04e9dd2
--- /dev/null
+++ b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.module
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Search API Saved Searches i18n integration module via entity API i18n support.
+ *
+ * @see EntityDefaultI18nController
+ */
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function search_api_saved_searches_i18n_entity_info_alter(&$info) {
+  // Enable i18n support via the entity API.
+  $info['search_api_saved_searches_settings']['i18n controller class'] = 'SearchApiSavedSearchesSettingsI18nController';
+}
+
+/**
+ * Implements hook_search_api_saved_searches_settings_insert().
+ */
+function search_api_saved_searches_i18n_search_api_saved_searches_settings_insert(SearchApiSavedSearchesSettings $settings) {
+  i18n_string_object_update('search_api_saved_searches_settings', $settings);
+}
+
+/**
+ * Implements hook_search_api_saved_searches_update().
+ */
+function search_api_saved_searches_i18n_search_api_saved_searches_settings_update(SearchApiSavedSearchesSettings $settings) {
+  // Account for name changes.
+  if ($settings->original->delta != $settings->delta) {
+    i18n_string_update_context("search_api_saved_searches:search_api_saved_searches_settings:{$settings->original->delta}:*", "search_api_saved_searches:search_api_saved_searches_settings:{$settings->delta}:*");
+  }
+  i18n_string_object_update('search_api_saved_searches_settings', $settings);
+}
+
+/**
+ * Implements hook_search_api_saved_searches_delete().
+ */
+function search_api_saved_searches_i18n_search_api_saved_searches_settings_delete(SearchApiSavedSearchesSettings $settings) {
+  if ($settings->hasStatus(ENTITY_IN_CODE)) {
+    i18n_string_object_update('search_api_saved_searches_settings', $settings);
+  }
+  else {
+    i18n_string_object_remove('search_api_saved_searches_settings', $settings);
+  }
+}
diff --git a/search_api_saved_searches_i18n/search_api_saved_searches_i18n.string_wrapper.inc b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.string_wrapper.inc
new file mode 100644
index 0000000..3942874
--- /dev/null
+++ b/search_api_saved_searches_i18n/search_api_saved_searches_i18n.string_wrapper.inc
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains the SearchApiSavedSearchesSettingsI18nStringObjectWrapper class.
+ */
+
+/**
+ * Custom i18n object wrapper.
+ */
+class SearchApiSavedSearchesSettingsI18nStringObjectWrapper extends i18n_string_object_wrapper {
+
+  /**
+   * Overrides i18n_string_object_wrapper::get_field() to read properties from the options array.
+   */
+  public function get_field($field, $default = NULL) {
+    if (strpos($field, '.') !== FALSE) {
+      $value = drupal_array_get_nested_value($this->object->options, explode('.', $field));
+      if (isset($value)) {
+        return $value;
+      }
+    }
+
+    if (isset($this->object->options[$field])) {
+      return $this->object->options[$field];
+    }
+
+    // Fallback to the usual behaviour.
+    return parent::get_field($field, $default);
+  }
+
+  /**
+   * Get translatable properties
+   */
+  protected function build_properties() {
+    $strings = parent::build_properties();
+    $properties = array();
+
+    // Dynamically add interval options.
+    foreach ($this->object->options['interval_options'] as $key => $value) {
+      $properties['interval_options.' . $key] = array(
+          'title' => t('Interval option, @key', array('@key' => $key)),
+          'string' => $value,
+      );
+    }
+    $strings[$this->get_textgroup()]['search_api_saved_searches_settings'][$this->object->delta] += $properties;
+    return $strings;
+  }
+
+}
\ No newline at end of file
