diff --git a/title.module b/title.module
index 05f7dfa..876155a 100644
--- a/title.module
+++ b/title.module
@@ -34,6 +34,8 @@ function title_module_implements_alter(&$implementations, $hook) {
       case 'entity_info_alter':
       case 'entity_presave':
       case 'field_attach_presave':
+      case 'field_create_field':
+      case 'field_update_field':
         $implementations['title'] = $group;
         break;
 
@@ -83,6 +85,60 @@ function title_entity_info_alter(&$info) {
 }
 
 /**
+ * Implements hook_field_create_field().
+ *
+ * Override the options list callback of taxonomy term reference fields
+ * with one that provides translated term names.
+ */
+function title_field_create_field($field) {
+  if ($field['type'] == 'taxonomy_term_reference' && empty($field['settings']['options_list_callback'])) {
+    $field['settings']['options_list_callback'] = 'title_taxonomy_allowed_values';
+    drupal_write_record('field_config', $record);
+    field_cache_clear(TRUE);
+  }
+}
+
+/**
+ * Implements hook_field_update_field().
+ *
+ * Override the options list callback of taxonomy term reference fields
+ * with one that provides translated term names.
+ */
+function title_field_update_field($field, $prior_field, $has_data) {
+  if ($field['type'] == 'taxonomy_term_reference' && empty($field['settings']['options_list_callback'])) {
+    $field['settings']['options_list_callback'] = 'title_taxonomy_allowed_values';
+    // Calling drupal_write_record() here directly doesn't work.
+    field_update_field($field);
+  }
+}
+
+/**
+ * Returns the set of valid terms for a taxonomy field.
+ *
+ * This is a copy of taxonomy_allowed_values() that ensures that
+ * taxonomy_get_tree() does an entity_load(), causing title replacement
+ * to happen.
+ *
+ * @param $field
+ *   The field definition.
+ * @return
+ *   The array of valid terms for this field, keyed by term id.
+ */
+function title_taxonomy_allowed_values($field) {
+  $options = array();
+  foreach ($field['settings']['allowed_values'] as $tree) {
+    if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
+      if ($terms = taxonomy_get_tree($vocabulary->vid, $tree['parent'], NULL, TRUE)) {
+        foreach ($terms as $term) {
+          $options[$term->tid] = str_repeat('-', $term->depth) . $term->name;
+        }
+      }
+    }
+  }
+  return $options;
+}
+
+/**
  * Return field replacement specific information.
  *
  * @param $entity_type
