diff --git a/select_or_other.field_widget.inc b/select_or_other.field_widget.inc
index 2564803..d1c6fe6 100644
--- a/select_or_other.field_widget.inc
+++ b/select_or_other.field_widget.inc
@@ -61,7 +61,7 @@ function select_or_other_field_widget_info() {
 /**
  * Prepare a single option.
  */
-function select_or_other_field_widget_form_prepare_option(&$options, $key, $opt, $settings) {
+function select_or_other_field_widget_form_prepare_option(&$options, $key, $opt, $settings, $field_name = NULL) {
   $opt = trim($opt);
   if (empty($opt)) {
     return;
@@ -79,7 +79,13 @@ function select_or_other_field_widget_form_prepare_option(&$options, $key, $opt,
   }
   // If option has no key specified and is not from PHP
   else {
-    $options[$opt] = html_entity_decode($opt);
+    $key = $opt;
+    $options[$key] = html_entity_decode($opt);
+  }
+
+  // attempt translation
+  if ($field_name != NULL) {
+    $options[$key] = select_or_other_tt('select_or_other:' . $field_name . ':#allowed_values:' . $key, $options[$key], array());
   }
 }
 
@@ -104,7 +110,6 @@ function _select_or_other_field_widget_get_available_options($select_or_other_fi
  */
 function select_or_other_field_widget_form_prepare_options($field, $instance, $has_value = FALSE) {
   $options = array();
-
   $settings = &$instance['widget']['settings'];
   $list = _select_or_other_field_widget_get_available_options($settings);
 
@@ -112,12 +117,12 @@ function select_or_other_field_widget_form_prepare_options($field, $instance, $h
     if (is_array($opt)) {
       $optgroup_options = array();
       foreach ($opt as $optgroup_key => $optgroup_opt) {
-        select_or_other_field_widget_form_prepare_option($optgroup_options, $optgroup_key, $optgroup_opt, $settings);
+        select_or_other_field_widget_form_prepare_option($optgroup_options, $optgroup_key, $optgroup_opt, $settings, $field['field_name']);
         $options[$key] = $optgroup_options;
       }
     }
     else {
-      select_or_other_field_widget_form_prepare_option($options, $key, $opt, $settings);
+      select_or_other_field_widget_form_prepare_option($options, $key, $opt, $settings, $field['field_name']);
     }
   }
 
@@ -155,11 +160,24 @@ function select_or_other_field_widget_form_prepare_options($field, $instance, $h
  * Implements hook_field_widget_form().
  */
 function select_or_other_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+
+  if (!empty($instance['widget']['settings']['other_title'])) {
+    $other_title = select_or_other_tt('select_or_other:' . $element['#field_name'] . ':other_title', $instance['widget']['settings']['other_title'], array('update' => TRUE));
+  } else {
+    $other_title = NULL;
+  }
+
+  if (isset($instance['widget']['settings']['other'])) {
+    $other = select_or_other_tt('select_or_other:' . $element['#field_name'] . ':other', $instance['widget']['settings']['other'], array('update' => 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' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL,
     '#options' => select_or_other_field_widget_form_prepare_options($field, $instance, !empty($items[$delta])),
@@ -305,6 +323,20 @@ function select_or_other_field_widget_settings_validate($element, &$form_state,
   $settings = &$form_state['values']['instance']['widget']['settings'];
   if (empty($settings['available_options']) && empty($settings['available_options_php'])) {
     form_set_error(implode('][', $element['#parents']), t('You must provide <em>Available options</em>.'));
+  } else {
+
+    //refresh translatable strings
+    $settings = $form_state['values']['instance']['widget']['settings'];
+    $options = explode("\n", $settings['available_options']);
+
+    $tkey = 'select_or_other:' . $form['#field']['field_name'];
+    foreach($options as $option) {
+      select_or_other_tt($tkey . ':#allowed_values:' . htmlentities(trim($option)), $option, array('update' => TRUE));
+    }
+
+    select_or_other_tt($tkey . ':other', $settings['other'], array('update' => TRUE));
+    select_or_other_tt($tkey . ':other_title', $settings['other_title'], array('update' => TRUE));
+
   }
 }
 
@@ -433,6 +465,24 @@ function select_or_other_field_formatter_info() {
 }
 
 /**
+ * Implements hook_entity_view().
+ */
+function select_or_other_entity_view($entity, $type, $view_mode, $langcode) {
+
+  $bundle = (isset($entity->type)) ? $entity->type : $type;
+
+  $fields = field_info_instances($type, $bundle);
+  foreach ($fields as $key => $field) {
+    if (isset($field['widget']['type']) && $field['widget']['type'] == 'select_or_other') {
+      // translate values
+      foreach($entity->content[$key]['#items'] as $delta => &$item) {
+        $entity->content[$key][$delta]['#markup'] = select_or_other_tt('select_or_other:' . $key . ':#allowed_values:' . htmlentities(trim($item['value'])), $item['value'], array());
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_field_formatter_view().
  */
 function select_or_other_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
@@ -462,7 +512,6 @@ function select_or_other_field_formatter_view($entity_type, $entity, $field, $in
       $element[$delta] = array('#markup' => $item['value']);
     }
   }
-
   return $element;
 }
 
diff --git a/select_or_other.module b/select_or_other.module
index 338ec8e..9062096 100644
--- a/select_or_other.module
+++ b/select_or_other.module
@@ -13,6 +13,82 @@ module_load_include('inc', 'select_or_other', 'select_or_other.test_form');
 module_load_include('inc', 'select_or_other', 'select_or_other.field_widget');
 
 /**
+ * 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' => FALSE, // This group cannot list all strings
+    'refresh callback' => 'select_or_other_i18n_string_refresh',
+  );
+  return $groups;
+}
+
+/**
+ * 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;
+  }
+}
+
+/**
+ * String refresh function
+ */
+function select_or_other_i18n_string_refresh() {
+  // get and traverse a field map for select or other text fields
+  $field_map = field_info_fields();
+  ddl($field_map);
+  foreach($field_map as $field_name => $field_properties) {
+    foreach ($field_properties['bundles'] as $entity_type => $bundles) {
+      foreach ($bundles as $bundle) {
+        // we need to load the field instance to check the widget at this point
+        if (isset($field_properties['type']) && $field_properties['type'] == 'text') {
+          $field = field_info_instance($entity_type, $field_name, $bundle);
+          // check for select or other widget
+          if ($field['widget']['type'] == 'select_or_other') {
+
+            $settings = $field['widget']['settings'];
+
+            $options = array();
+            $list = _select_or_other_field_widget_get_available_options($settings);
+
+            foreach ($list as $key => $opt) {
+              if (is_array($opt)) {
+                $optgroup_options = array();
+                foreach ($opt as $optgroup_key => $optgroup_opt) {
+                  select_or_other_field_widget_form_prepare_option($optgroup_options, $optgroup_key, $optgroup_opt, $settings);
+                  $options[$key] = $optgroup_options;
+                }
+              }
+              else {
+                select_or_other_field_widget_form_prepare_option($options, $key, $opt, $settings);
+              }
+            }
+
+            $tkey = 'select_or_other:' . $field['field_name'];
+            $update = array('update' => TRUE);
+
+            select_or_other_tt($tkey . ':other', $settings['other'], $update);
+            select_or_other_tt($tkey . ':other_title', $settings['other_title'], $update);
+
+            foreach ($options as $key => &$option) {
+              $option = select_or_other_tt($tkey . ':#allowed_values:' . $key, $option, $update);
+            }
+          }
+        }
+      }
+    }
+  }
+  return TRUE;
+}
+
+/**
  * Implements hook_theme().
  */
 function select_or_other_theme() {
