diff --git a/select_or_other.field_formatter.inc b/select_or_other.field_formatter.inc
index 0449e53..5a5728e 100644
--- a/select_or_other.field_formatter.inc
+++ b/select_or_other.field_formatter.inc
@@ -41,7 +41,7 @@ function select_or_other_field_formatter_view($entity_type, $entity, $field, $in
 
   foreach ($items as $delta => $item) {
     if (array_key_exists($item['value'], $field_options)) {
-      $element[$delta] = array('#markup' => $field_options[$item['value']]);
+      $element[$delta] = array('#markup' => select_or_other_tt('select_or_other:' . $instance['field_name'] . ':#allowed_values:' . $item['value'], $field_options[$item['value']], array()));
     }
     else {
       $element[$delta] = array('#markup' => $item['value']);
diff --git a/select_or_other.field_widget.inc b/select_or_other.field_widget.inc
index cc82ccc..75e1702 100644
--- a/select_or_other.field_widget.inc
+++ b/select_or_other.field_widget.inc
@@ -124,11 +124,25 @@ function select_or_other_field_widget_form(&$form, &$form_state, $field, $instan
     }
   }
 
+  if (!empty($instance['widget']['settings']['other_title'])) {
+    $other_title = select_or_other_tt('select_or_other:' . $element['#field_name'] . ':#other:other_title', $instance['widget']['settings']['other_title'], array('translate' => TRUE));
+  }
+  else {
+    $other_title = null;
+  }
+
+  if (isset($instance['widget']['settings']['other'])) {
+    $other = select_or_other_tt('select_or_other:' . $element['#field_name'] . ':#other:other', $instance['widget']['settings']['other'], array('translate' => TRUE));
+  }
+  else {
+    $other = t('Other');
+  }
+
   // Construct the element.
   $element = $element + array(
       '#type' => 'select_or_other',
-      '#other' => isset($instance['widget']['settings']['other']) ? $instance['widget']['settings']['other'] : t('Other'),
-      '#other_title' => !empty($instance['widget']['settings']['other_title']) ? $instance['widget']['settings']['other_title'] : NULL,
+      '#other' => $other,
+      '#other_title' => $other_title,
       '#other_size' => $instance['widget']['settings']['other_size'],
       '#default_value' => $field['cardinality'] != 1 ? $default_value : reset($default_value),
       '#options' => select_or_other_field_widget_form_prepare_options($field, $instance),
@@ -180,9 +194,44 @@ function select_or_other_field_widget_form(&$form, &$form_state, $field, $instan
 }
 
 /**
+ * Implements hook_field_create_instance().
+ */
+function select_or_other_field_create_instance($instance) {
+  if (empty($instance['widget']['settings']['available_options']) || !function_exists('i18n_string_update')) {
+    return;
+  }
+  $field = field_read_field($instance['field_name']);
+  if ($field['type'] !== 'text') {
+    return;
+  }
+
+  $tkey = 'select_or_other:' . $instance['field_name'] . ':#other';
+  $settings = $instance['widget']['settings'];
+
+  if (!empty($settings['other'])) {
+    i18n_string_update($tkey . ':other', $settings['other']);
+  }
+  if (!empty($settings['other_title'])) {
+    i18n_string_update($tkey . ':other_title', $settings['other_title']);
+  }
+  $field = field_info_field($instance['field_name']);
+  $options = select_or_other_field_widget_form_prepare_options($field, $instance, FALSE);
+
+  $tkey = 'select_or_other:' . $instance['field_name'] . ':#allowed_values:*';
+  i18n_string_update($tkey , $options);
+}
+
+/**
+ * Implements hook_field_update_instance().
+ */
+function select_or_other_field_update_instance($instance, $prior_instance) {
+  select_or_other_field_create_instance($instance);
+}
+
+/**
  * Prepare options for the widget list.
  */
-function select_or_other_field_widget_form_prepare_options($field, $instance) {
+function select_or_other_field_widget_form_prepare_options($field, $instance, $translate = TRUE) {
   $options = array();
 
   $list = _select_or_other_field_widget_get_available_options($instance, $field);
@@ -200,6 +249,10 @@ function select_or_other_field_widget_form_prepare_options($field, $instance) {
     }
   }
 
+  if (function_exists('i18n_string_translate') && $translate) {
+    $options = i18n_string_translate('select_or_other:' . $field['field_name'] . ':#allowed_values:*', $options);
+  }
+
   // @todo: This isset() can probably be taken out in drupal 8.
   if (isset($settings['sort_options']) && $settings['sort_options']) {
     natcasesort($options);
diff --git a/select_or_other.info b/select_or_other.info
index 51b4688..a281557 100644
--- a/select_or_other.info
+++ b/select_or_other.info
@@ -6,4 +6,7 @@ package = Fields
 files[] = tests/select_or_other_admin.test
 files[] = tests/select_or_other_number.test
 files[] = tests/select_or_other_text.test
+files[] = tests/select_or_other_i18n.test
 files[] = tests/SelectOrOtherTestBase.test
+
+test_dependencies[] = i18n:i18n_string
diff --git a/select_or_other.module b/select_or_other.module
index 7cda82b..a8f2c30 100644
--- a/select_or_other.module
+++ b/select_or_other.module
@@ -10,6 +10,68 @@ module_load_include('inc', 'select_or_other', 'select_or_other.field_widget');
 module_load_include('inc', 'select_or_other', 'select_or_other.field_formatter');
 
 /**
+ * Implements hook_i18n_string_info()
+ */
+function select_or_other_i18n_string_info() {
+  $groups['select_or_other'] = array(
+    'title' => t('Select (or other)'),
+    'description' => t('Localizable variables for select (or other) module.'),
+    'format' => FALSE, // This group doesn't have strings with format.
+    'list' => TRUE, // This group can list all strings.
+  );
+  return $groups;
+}
+
+/**
+ * Implements hook_i18n_string_list().
+ */
+function select_or_other_i18n_string_list($group) {
+  $strings = array();
+  if ($group === 'select_or_other') {
+    $fields = field_info_field_map();
+    foreach ($fields as $field_name => $field_info) {
+      if (isset($field_info['type']) && $field_info['type'] !== 'text') {
+        continue;
+      }
+      foreach ($field_info['bundles'] as $entity_type => $bundles) {
+        foreach ($bundles as $bundle) {
+          $instance = field_info_instance($entity_type, $field_name, $bundle);
+          if (empty($instance['widget']['settings']['available_options'])) {
+            continue;
+          }
+          if ($instance['widget']['type'] === 'select_or_other' || $instance['widget']['type'] === 'select_or_other_buttons') {
+            $settings = $instance['widget']['settings'];
+            if (!empty($settings['other'])) {
+              $strings[$group][$field_name]['#other']['other'] = $settings['other'];
+            }
+            if (!empty($settings['other_title'])) {
+              $strings[$group][$field_name]['#other']['other_title'] = $settings['other_title'];
+            }
+            $options = select_or_other_field_widget_form_prepare_options($field_info, $instance, FALSE);
+            foreach ($options as $key => $option) {
+              $strings[$group][$field_name]['#allowed_values'][$key] = $option;
+            }
+          }
+        }
+      }
+    }
+  }
+  return $strings;
+}
+
+/**
+ * Wrapper function for translating items using i18n.
+ */
+function select_or_other_tt($name, $string, $options = array()) {
+  if (function_exists('i18n_string')) {
+    return i18n_string($name, $string, $options);
+  }
+  else {
+    return $string;
+  }
+}
+
+/**
  * Implements hook_theme().
  */
 function select_or_other_theme() {
@@ -18,7 +80,6 @@ function select_or_other_theme() {
       'render element' => 'element',
     ),
   );
-
 }
 
 /**
diff --git a/tests/SelectOrOtherTestBase.test b/tests/SelectOrOtherTestBase.test
index 5e1314a..ad5d2f5 100644
--- a/tests/SelectOrOtherTestBase.test
+++ b/tests/SelectOrOtherTestBase.test
@@ -30,7 +30,9 @@ class SelectOrOtherTestBase extends DrupalWebTestCase {
       $modules = $modules[0];
     }
     // At the very least enable the select_or_other module.
-    parent::setUp(array_merge(array('select_or_other'), $modules));
+    // We need to enable i18n_string or we get this error Class 'i18n_string_textgroup_default' not found.
+    // Makes no sense. https://www.drupal.org/node/1209484.
+    parent::setUp(array_merge(array('select_or_other', 'i18n_string'), $modules));
     // Clear the array of fields to test.
     $this->fields = array();
   }
@@ -321,4 +323,4 @@ class SelectOrOtherTestBase extends DrupalWebTestCase {
     return $this->fields[$field_name]['content_type']->name;
   }
 
-}
\ No newline at end of file
+}
diff --git a/tests/select_or_other_admin.test b/tests/select_or_other_admin.test
index 86943dc..8f913c5 100644
--- a/tests/select_or_other_admin.test
+++ b/tests/select_or_other_admin.test
@@ -94,4 +94,4 @@ class SelectOrOtherAdminTestCase extends SelectOrOtherTestBase {
     $this->assertRaw('Keyed');
   }
 
-}
\ No newline at end of file
+}
