diff --git a/includes/simplenews.admin.inc b/includes/simplenews.admin.inc
index c0027fd..0a8ecc0 100644
--- a/includes/simplenews.admin.inc
+++ b/includes/simplenews.admin.inc
@@ -326,7 +326,7 @@ function simplenews_admin_categories() {
   if ($categories = simplenews_categories_load_multiple(array(), array('show_all' => TRUE))) {
     foreach ($categories as $category) {
       $form[$category->tid]['#category'] = $category;
-      $form[$category->tid]['name'] = array('#markup' => check_plain($category->name));
+      $form[$category->tid]['name'] = array('#markup' => check_plain(_simplenews_newsletter_name($category)));
       $form[$category->tid]['weight'] = array('#type' => 'weight', '#delta' => 10, '#default_value' => $category->weight);
       $form[$category->tid]['edit'] = array('#type' => 'link', '#title' => t('edit newsletter category'), '#href' => "admin/structure/simplenews/$category->tid/edit");
     }
@@ -644,13 +644,13 @@ function simplenews_admin_category_form_submit($form, &$form_state) {
 
   switch (simplenews_category_save($category)) {
     case SAVED_NEW:
-      drupal_set_message(t('Created new newsletter category %name.', array('%name' => $category->name)));
-      watchdog('simplenews', 'Created new newsletter category %name.', array('%name' => $category->name), WATCHDOG_NOTICE, l(t('edit'), 'admin/structure/simplenews/' . $category->tid . '/edit'));
+      drupal_set_message(t('Created new newsletter category %name.', array('%name' => _simplenews_newsletter_name($category))));
+      watchdog('simplenews', 'Created new newsletter category %name.', array('%name' => _simplenews_newsletter_name($category)), WATCHDOG_NOTICE, l(t('edit'), 'admin/structure/simplenews/' . $category->tid . '/edit'));
       break;
 
     case SAVED_UPDATED:
-      drupal_set_message(t('Updated newsletter category %name.', array('%name' => $category->name)));
-      watchdog('simplenews', 'Updated newsletter category %name.', array('%name' => $category->name), WATCHDOG_NOTICE, l(t('edit'), 'admin/structure/simplenews/' . $category->tid . '/edit'));
+      drupal_set_message(t('Updated newsletter category %name.', array('%name' => _simplenews_newsletter_name($category))));
+      watchdog('simplenews', 'Updated newsletter category %name.', array('%name' => _simplenews_newsletter_name($category)), WATCHDOG_NOTICE, l(t('edit'), 'admin/structure/simplenews/' . $category->tid . '/edit'));
       break;
   }
 
@@ -668,14 +668,14 @@ function simplenews_admin_category_delete($form, &$form_state, $category) {
   // Store some category values for submit handling.
   $form = array();
   $form['tid'] = array('#type' => 'value', '#value' => $category->tid);
-  $form['name'] = array('#type' => 'value', '#value' => $category->name);
+  $form['name'] = array('#type' => 'value', '#value' => _simplenews_newsletter_name($category));
 
   $form['notice'] = array(
     '#markup' => '<p><strong>' . t('Note: All subscriptions associated with this newsletter will be lost.') . '</strong></p>',
   );
 
   return confirm_form($form,
-    t('Are you sure you want to delete category %name?', array('%name' => $category->name)),
+    t('Are you sure you want to delete category %name?', array('%name' => _simplenews_newsletter_name($category))),
     'admin/structure/simplenews',
     t('This action cannot be undone.'),
     t('Delete'),
@@ -783,8 +783,8 @@ function simplenews_subscription_list_add($form, &$form_state) {
   foreach (simplenews_get_mailing_lists(TRUE) as $list) {
     $form['lists'][$list->tid] = array(
       '#type' => 'checkbox',
-      '#title' => check_plain($list->name),
-      '#description'  => $list->description,
+      '#title' => check_plain(_simplenews_newsletter_name($list)),
+      '#description'  => _simplenews_newsletter_description($list),
       '#default_value' => FALSE,
     );
   }
@@ -911,7 +911,7 @@ function simplenews_subscription_list_export($form, &$form_state) {
 
   $lists = array();
   foreach (simplenews_get_mailing_lists(TRUE) as $list) {
-    $lists[$list->tid] = check_plain($list->name);
+    $lists[$list->tid] = check_plain(_simplenews_newsletter_name($list));
   }
   $form['lists'] = array(
     '#type' => 'checkboxes',
@@ -1024,8 +1024,8 @@ function simplenews_subscription_list_remove($form, &$form_state) {
   foreach (simplenews_get_mailing_lists(TRUE) as $list) {
     $form['lists'][$list->tid] = array(
       '#type' => 'checkbox',
-      '#title' => check_plain($list->name),
-      '#description'  => $list->description,
+      '#title' => check_plain(_simplenews_newsletter_name($list)),
+      '#description'  => _simplenews_newsletter_description($list),
       '#default_value' => FALSE,
     );
   }
@@ -1066,7 +1066,7 @@ function simplenews_subscription_list_remove_submit($form, &$form_state) {
     $lists = simplenews_get_mailing_lists(TRUE);
     $list_names = array();
     foreach ($checked_lists as $tid) {
-      $list_names[] = $lists[$tid]->name;
+      $list_names[] = _simplenews_newsletter_name($lists[$tid]);
     }
     drupal_set_message(t('The addresses were unsubscribed from the following newsletters: %newsletters.', array('%newsletters' => implode(', ', $list_names))));
   }
@@ -1598,7 +1598,7 @@ function simplenews_subscription_filters() {
     ),
   );
   foreach (simplenews_get_mailing_lists(TRUE) as $list) {
-    $filters['list']['options']['tid-' . $list->tid] = $list->name;
+    $filters['list']['options']['tid-' . $list->tid] = _simplenews_newsletter_name($list);
   }
 
   // Email filter
diff --git a/includes/simplenews.subscription.inc b/includes/simplenews.subscription.inc
index 958501a..816fc67 100644
--- a/includes/simplenews.subscription.inc
+++ b/includes/simplenews.subscription.inc
@@ -139,7 +139,7 @@ function simplenews_confirm_subscription() {
           $path = $path . '/' . implode('/', $arguments);
           drupal_goto($path);
         }
-        drupal_set_message(t('%user was unsubscribed from the %newsletter mailing list.', array('%user' => $subscriber->mail, '%newsletter' => $category->name)));
+        drupal_set_message(t('%user was unsubscribed from the %newsletter mailing list.', array('%user' => $subscriber->mail, '%newsletter' => _simplenews_newsletter_name($category))));
         drupal_goto(variable_get('site_frontpage', 'node'));
       }
       elseif ($op == 'add') {
@@ -148,7 +148,7 @@ function simplenews_confirm_subscription() {
           $path = $path . '/' . implode('/', $arguments);
           drupal_goto($path);
         }
-        drupal_set_message(t('%user was added to the %newsletter mailing list.', array('%user' => $subscriber->mail, '%newsletter' => $category->name)));
+        drupal_set_message(t('%user was added to the %newsletter mailing list.', array('%user' => $subscriber->mail, '%newsletter' => _simplenews_newsletter_name($category))));
         drupal_goto(variable_get('site_frontpage', 'node'));
       }
     }
@@ -167,7 +167,7 @@ function simplenews_confirm_subscription() {
 function simplenews_confirm_add_form($form, &$form_state, $mail, $newsletter) {
   $form = array();
   $form['question'] = array(
-    '#markup' => '<p>' . t('Are you sure you want to add %user to the %newsletter mailing list?', array('%user' => $mail, '%newsletter' => $newsletter->name)) . "<p>\n",
+    '#markup' => '<p>' . t('Are you sure you want to add %user to the %newsletter mailing list?', array('%user' => $mail, '%newsletter' => _simplenews_newsletter_name($newsletter))) . "<p>\n",
   );
   $form['mail'] = array(
     '#type' => 'value',
@@ -192,7 +192,7 @@ function simplenews_confirm_add_form_submit($form, &$form_state) {
 
   if (!$path =  variable_get('simplenews_confirm_subscribe_page', '')){
     $path = variable_get('site_frontpage', 'node');
-    drupal_set_message(t('%user was added to the %newsletter mailing list.', array('%user' => $form_state['values']['mail'], '%newsletter' => $form_state['values']['newsletter']->name)));
+    drupal_set_message(t('%user was added to the %newsletter mailing list.', array('%user' => $form_state['values']['mail'], '%newsletter' => _simplenews_newsletter_name($form_state['values']['newsletter']))));
   }
 
   $form_state['redirect'] = $path;
@@ -206,7 +206,7 @@ function simplenews_confirm_add_form_submit($form, &$form_state) {
 function simplenews_confirm_removal_form($form, &$form_state, $mail, $newsletter) {
   $form = array();
   $form['question'] = array(
-    '#markup' => '<p>' . t('Are you sure you want to remove %user from the %newsletter mailing list?', array('%user' => $mail, '%newsletter' => $newsletter->name)) . "<p>\n",
+    '#markup' => '<p>' . t('Are you sure you want to remove %user from the %newsletter mailing list?', array('%user' => $mail, '%newsletter' => _simplenews_newsletter_name($newsletter))) . "<p>\n",
   );
   $form['mail'] = array(
     '#type' => 'value',
@@ -231,7 +231,7 @@ function simplenews_confirm_removal_form_submit($form, &$form_state) {
 
   if (!$path =  variable_get('simplenews_confirm_unsubscribe_page', '')){
     $path = variable_get('site_frontpage', 'node');
-    drupal_set_message(t('%user was unsubscribed from the %newsletter mailing list.', array('%user' => $form_state['values']['mail'], '%newsletter' => $form_state['values']['newsletter']->name)));
+    drupal_set_message(t('%user was unsubscribed from the %newsletter mailing list.', array('%user' => $form_state['values']['mail'], '%newsletter' => _simplenews_newsletter_name($form_state['values']['newsletter']))));
   }
 
   $form_state['redirect'] = $path;
diff --git a/simplenews.info b/simplenews.info
index c6f5e9d..31a1794 100644
--- a/simplenews.info
+++ b/simplenews.info
@@ -5,6 +5,8 @@ core = 7.x
 configure = admin/config/simplenews
 dependencies[] = taxonomy
 
+test_dependencies[] = i18n_taxonomy
+
 files[] = tests/simplenews.test
 files[] = includes/views/handlers/simplenews_handler_field_newsletter_status.inc
 files[] = includes/views/handlers/simplenews_handler_field_newsletter_priority.inc
diff --git a/simplenews.module b/simplenews.module
index e101361..afb7da0 100644
--- a/simplenews.module
+++ b/simplenews.module
@@ -699,7 +699,7 @@ function simplenews_form_taxonomy_form_term_alter(&$form, $form_state) {
   if (isset($form_state['confirm_delete']) && $form_state['confirm_delete']) {
     if ($form['#term']->vid == variable_get('simplenews_vid', 0)) {
       $category = simplenews_category_load($form['#term']->tid);
-      $form['description']['#markup'] = '<p>' . t('This taxonomy term is part of simplenews newsletter category %category_name. Deleting this term will delete the newsletter category and <strong>all subscriptions to category %category_name</strong>. This action cannot be undone.', array('%category_name' => $category->name)) . '</p>' . $form['description']['#markup'];
+      $form['description']['#markup'] = '<p>' . t('This taxonomy term is part of simplenews newsletter category %category_name. Deleting this term will delete the newsletter category and <strong>all subscriptions to category %category_name</strong>. This action cannot be undone.', array('%category_name' => _simplenews_newsletter_name($category))) . '</p>' . $form['description']['#markup'];
     }
   }
 }
@@ -812,7 +812,7 @@ function simplenews_simplenews_category_delete($category) {
 
   // Delete subscriptions
   simplenews_subscription_delete(array('tid' => $category->tid));
-  drupal_set_message(t('All subscriptions to newsletter %newsletter have been deleted.', array('%newsletter' => $category->name)));
+  drupal_set_message(t('All subscriptions to newsletter %newsletter have been deleted.', array('%newsletter' => _simplenews_newsletter_name($category))));
 
   // Delete subscription block
   db_delete('block')
@@ -837,7 +837,7 @@ function simplenews_form_user_register_form_alter(&$form, &$form_state) {
     $subscribe_new_account = $list->new_account;
     $opt_inout_method = $list->opt_inout;
     if (($subscribe_new_account == 'on' || $subscribe_new_account == 'off') && ($opt_inout_method == 'single' || $opt_inout_method == 'double')) {
-      $options[$list->tid] = check_plain($list->name);
+      $options[$list->tid] = check_plain(_simplenews_newsletter_name($list));
       if ($subscribe_new_account == 'on') {
         $default_value[] = $list->tid;
       }
@@ -898,7 +898,7 @@ function simplenews_user_insert(&$edit, $account, $category) {  // Use the email
       $newsletters = simplenews_categories_load_multiple($nl_tids, array('show_all' => TRUE));
       foreach ($newsletters as $newsletter) {
         simplenews_subscribe_user($account->mail, $newsletter->tid, FALSE, 'website', $edit['language']);
-        drupal_set_message(t('You have been subscribed to %newsletter.', array('%newsletter' => $newsletter->name)));
+        drupal_set_message(t('You have been subscribed to %newsletter.', array('%newsletter' => _simplenews_newsletter_name($newsletter))));
       }
     }
   }
@@ -1070,7 +1070,7 @@ function simplenews_user_view($account, $build_mode) {
 
     foreach ($newsletters as $newsletter) {
       if (isset($subscription->newsletter_subscription[$newsletter->tid]) && $subscription->newsletter_subscription[$newsletter->tid]->status == TRUE) {
-        $links[] = l($newsletter->name, 'taxonomy/term/' . $newsletter->tid);
+        $links[] = l(_simplenews_newsletter_name($newsletter), 'taxonomy/term/' . $newsletter->tid);
       }
     }
     if (isset($links)) {
@@ -1109,7 +1109,7 @@ function simplenews_block_info() {
   foreach (simplenews_categories_load_multiple(array(), array('block' => '1', 'show_all' => FALSE)) as $category) {
     //@todo 1. without form -> by role; 2. with form -> user caching with refresh on subscribe/unsubscribe (option as setting) or no caching
     $blocks[$category->tid] = array(
-      'info' => t('Newsletter: @title', array('@title' => $category->name)),
+      'info' => t('Newsletter: @title', array('@title' => _simplenews_newsletter_name($category))),
       // @todo Use block's own settings?
       'cache' => variable_get('simplenews_block_f_' . $category->tid, 1) ? DRUPAL_NO_CACHE : DRUPAL_CACHE_PER_ROLE,
     );
@@ -1185,7 +1185,7 @@ function simplenews_block_view($delta = '') {
   if (in_array($delta, array_keys($newsletters))) {
     // $delta is validated, the block can be displayed.
     $block = array(
-      'subject' => check_plain($newsletters[$delta]->name),
+      'subject' => check_plain(_simplenews_newsletter_name($newsletters[$delta])),
       'content' => theme(array('simplenews_block__' . $delta, 'simplenews_block'), array('tid' => $delta)),
     );
     return $block;
@@ -1707,8 +1707,8 @@ function _simplenews_subscription_manager_form($subscription) {
   foreach (simplenews_get_mailing_lists(user_access('administer simplenews subscriptions')) as $newsletter) {
     $form['subscriptions']['newsletter-' . $newsletter->tid] = array(
       '#type' => 'checkbox',
-      '#title' => check_plain($newsletter->name),
-      '#description' => check_plain($newsletter->description),
+      '#title' => check_plain(_simplenews_newsletter_name($newsletter)),
+      '#description' => check_plain(_simplenews_newsletter_description($newsletter)),
       '#default_value' => in_array($newsletter->tid, $subscription->tids),
     );
   }
@@ -2238,8 +2238,7 @@ function simplenews_category_list() {
   $categories = simplenews_categories_load_multiple();
   $cats = array();
   foreach ($categories as $key => $category) {
-    // @todo translate category names.
-    $cats[$key] = $category->name;
+    $cats[$key] = _simplenews_newsletter_name($category);
   }
   return $cats;
 }
@@ -2258,7 +2257,7 @@ function simplenews_categories_load_multiple($tids = array(), $conditions = arra
     // already deleted.
     $query->leftJoin('taxonomy_term_data', 't', 't.tid = sc.tid');
     $query->fields('sc')
-      ->fields('t', array('name', 'description', 'weight'))
+      ->fields('t', array('name', 'description', 'weight', 'vid'))
       ->orderBy('t.weight', 'ASC');
     if ($tids) {
       $query->condition('sc.tid', $tids);
@@ -2541,9 +2540,9 @@ function simplenews_tokens($type, $tokens, $data = array(), $options = array())
       foreach ($tokens as $name => $original) {
         switch ($name) {
           case 'name':
-            // @todo translate category name
             if (isset($category->name)) {
-              $replacements[$original] = $sanitize ? check_plain($category->name) : $category->name;
+              $newsletter_name = _simplenews_newsletter_name($category);
+              $replacements[$original] = $sanitize ? check_plain($newsletter_name) : $newsletter_name;
             }
             else {
               $replacements[$original] = t('Unassigned newsletter');
@@ -2704,18 +2703,33 @@ function simplenews_help($path, $arg) {
  * @return string
  *   The translated newsletter name.
  */
-function _simplenews_tt_newsletter_name($newsletter, $langcode = NULL) {
-  // @todo Translate newsletter name
+function _simplenews_newsletter_name($newsletter, $langcode = NULL) {
+  if (module_exists('i18n_taxonomy')) {
+    return i18n_taxonomy_term_name($newsletter, $langcode);
+  }
   return $newsletter->name;
-/*
-  global $language;
-  $langcode = isset($langcode) ? $langcode : $language->language;
+}
+
 
-  if (module_exists('i18ntaxonomy') && i18ntaxonomy_vocabulary(variable_get('simplenews_vid', '')) == I18N_TAXONOMY_LOCALIZE) {
-    return tt('taxonomy:term:' . $newsletter->tid . ':name', $newsletter->name, $langcode);
+/**
+ * Helper function to translate a newsletter description if required.
+ *
+ * @param object $newsletter
+ *   Newsletter category object, typically from simplenews_category_load().
+ *   Contains at least the following properties:
+ *   - tid: The newsletter category id.
+ *   - name: The newsletter name.
+ * @param string $langcode
+ *   (optional) The language code.  Defaults to $GLOBALS['language'].
+ *
+ * @return string
+ *   The translated newsletter name.
+ */
+function _simplenews_newsletter_description($newsletter, $langcode = NULL) {
+  if (module_exists('i18n_taxonomy')) {
+    return i18n_string(array('taxonomy', 'term', $newsletter->tid, 'description'), $newsletter->description, array('langcode' => $langcode));
   }
-  return $newsletter->name;
-*/
+  return $newsletter->description;
 }
 
 /**
@@ -2921,7 +2935,7 @@ function template_preprocess_simplenews_block(&$variables) {
   $variables['newsletter_link'] = l(t('Previous issues'), 'taxonomy/term/' . $tid);
   $recent = simplenews_recent_newsletters($tid, variable_get('simplenews_block_i_' . $tid, 5));
   $variables['issue_list'] = theme('item_list', array('items' => $recent, 'title' => t('Previous issues'), 'type' => 'ul'));
-  $variables['rssfeed'] = theme('feed_icon', array('url' => 'taxonomy/term/' . $tid . '/feed', 'title' => t('@newsletter feed', array('@newsletter' => $category->name))));
+  $variables['rssfeed'] = theme('feed_icon', array('url' => 'taxonomy/term/' . $tid . '/feed', 'title' => t('@newsletter feed', array('@newsletter' => _simplenews_newsletter_name($category)))));
 
   // Block content control variables
   $variables['use_form'] = variable_get('simplenews_block_f_' . $tid, 1);
diff --git a/simplenews_action/simplenews_action.module b/simplenews_action/simplenews_action.module
index e5b6232..3621722 100644
--- a/simplenews_action/simplenews_action.module
+++ b/simplenews_action/simplenews_action.module
@@ -209,7 +209,7 @@ function simplenews_action_subscribe_user_form($context) {
   $lists = simplenews_get_mailing_lists(TRUE);
   $options = array();
   foreach ($tree as $newsletter) {
-    $options[$list->slid] = $list->name;
+    $options[$list->slid] = _simplenews_newsletter_name($list);
   }
   $form['list'] = array(
     '#title' => t('Mailing list'),
@@ -277,7 +277,7 @@ function simplenews_action_unsubscribe_user_form($context) {
   $lists = simplenews_get_mailing_lists(TRUE);
   $options = array();
   foreach ($tree as $newsletter) {
-    $options[$list->slid] = $list->name;
+    $options[$list->slid] = _simplenews_newsletter_name($list);
   }
   $form['list'] = array(
     '#title' => t('Mailing list'),
diff --git a/tests/simplenews.test b/tests/simplenews.test
index b016b6c..5f44b35 100644
--- a/tests/simplenews.test
+++ b/tests/simplenews.test
@@ -11,8 +11,8 @@
 
 class SimplenewsTestCase extends DrupalWebTestCase {
 
-  public function setUp() {
-    parent::setUp('taxonomy', 'simplenews');
+  public function setUp($modules = array()) {
+    parent::setUp(array_merge(array('taxonomy', 'simplenews'), $modules));
 
     //$this->simplenews_admin_user = $this->drupalCreateUser(array('administer newsletters', 'administer simplenews settings', 'administer simplenews subscriptions'));
     //$this->sender_user = $this->drupalCreateUser(array('create simplenews content', 'edit own simplenews content', 'send newsletter'));
@@ -751,3 +751,125 @@ class SimpleNewsAdministrationTestCase extends SimplenewsTestCase {
     $this->drupalPost('admin/structure/types/manage/' . $type . '/delete', array(), t('Delete'));
   }
 }
+
+class SimpleNewsI18nTestCase extends SimplenewsTestCase {
+
+  /**
+   * Implementation of getInfo().
+   */
+  function getInfo() {
+    return array(
+      'name' => t('Simplenews I18n'),
+      'description' => t('Translation of newsletter categories'),
+      'group' => t('Simplenews'),
+      'dependencies' => array('i18n_taxonomy'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('i18n_taxonomy'));
+    $this->admin_user = $this->drupalCreateUser(array('bypass node access', 'administer nodes', 'administer languages', 'administer content types', 'administer blocks', 'access administration pages', 'administer filters', 'administer taxonomy', 'translate interface', 'subscribe to newsletters'));
+    $this->drupalLogin($this->admin_user);
+    $this->setUpLanguages();
+  }
+
+
+  /**
+   * Install a the specified language if it has not been already. Otherwise make sure that
+   * the language is enabled.
+   *
+   * Copied from Drupali18nTestCase::addLanguage().
+   *
+   * @param $language_code
+   *   The language code the check.
+   */
+  function addLanguage($language_code) {
+    // Check to make sure that language has not already been installed.
+    $this->drupalGet('admin/config/regional/language');
+
+    if (strpos($this->drupalGetContent(), 'enabled[' . $language_code . ']') === FALSE) {
+      // Doesn't have language installed so add it.
+      $edit = array();
+      $edit['langcode'] = $language_code;
+      $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+      // Make sure we are not using a stale list.
+      drupal_static_reset('language_list');
+      $languages = language_list('language');
+      $this->assertTrue(array_key_exists($language_code, $languages), t('Language was installed successfully.'));
+
+      if (array_key_exists($language_code, $languages)) {
+        $this->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => $languages[$language_code]->name, '@locale-help' => url('admin/help/locale'))), t('Language has been created.'));
+      }
+    }
+    elseif ($this->xpath('//input[@type="checkbox" and @name=:name and @checked="checked"]', array(':name' => 'enabled[' . $language_code . ']'))) {
+      // It's installed and enabled. No need to do anything.
+      $this->assertTrue(true, 'Language [' . $language_code . '] already installed and enabled.');
+    }
+    else {
+      // It's installed but not enabled. Enable it.
+      $this->assertTrue(true, 'Language [' . $language_code . '] already installed.');
+      $this->drupalPost(NULL, array('enabled[' . $language_code . ']' => TRUE), t('Save configuration'));
+      $this->assertRaw(t('Configuration saved.'), t('Language successfully enabled.'));
+    }
+  }
+
+  function testCategoryTranslation() {
+    $this->drupalLogin($this->admin_user);
+    // Make Input Format "Filtered Text" translatable
+    $edit = array(
+      'i18n_string_allowed_formats[filtered_html]' => 'filtered_html',
+      'i18n_string_allowed_formats[plain_text]' => 'plain_text',
+    );
+    $this->drupalPost('admin/config/regional/i18n/strings', $edit, t('Save configuration'));
+
+    $vocabulary = taxonomy_vocabulary_load(variable_get('simplenews_vid', 0));
+    $vocabulary->i18n_mode = I18N_MODE_LOCALIZE;
+    taxonomy_vocabulary_save($vocabulary);
+    drupal_static_reset('i18n_taxonomy_vocabulary_mode');
+
+    // Refresh strings.
+    module_invoke_all('i18n_string_refresh', 'taxonomy');
+
+    $tid = array_shift(simplenews_categories_load_multiple())->tid;
+    // Translate term to spanish.
+    list($textgroup, $context) = i18n_string_context(array('taxonomy', 'term', $tid, 'name'));
+    i18n_string_textgroup($textgroup)->update_translation($context, 'es', $es_name = $this->randomName());
+    list($textgroup, $context) = i18n_string_context(array('taxonomy', 'term', $tid, 'description'));
+    i18n_string_textgroup($textgroup)->update_translation($context, 'es', $es_description = $this->randomName());
+
+    // Visit newsletter selection page in english.
+    $this->drupalGet('user/' . $this->admin_user->uid . '/edit/simplenews');
+    $this->assertText(t('Drupal newsletter'));
+    $this->assertText(t('Drupal newsletter categories.'));
+
+    // And now in spanish.
+    $this->drupalGet('es/user/' . $this->admin_user->uid . '/edit/simplenews');
+    $this->assertText($es_name, t('Category name is translated.'));
+    $this->assertText($es_description, t('Category description is translated'));
+  }
+
+  /**
+   * Set up configuration for multiple languages.
+   *
+   * Copied from Drupali18nTestCase::setUpLanguages().
+   */
+  function setUpLanguages($admin_permissions = array()) {
+
+    // Add languages.
+    $this->default_language = 'en';
+    $this->secondary_language = 'es';
+    $this->addLanguage($this->default_language);
+    $this->addLanguage($this->secondary_language);
+
+    // Enable URL language detection and selection to make the language switcher
+    // block appear.
+    $edit = array('language[enabled][locale-url]' => TRUE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    $this->assertRaw(t('Language negotiation configuration saved.'), t('URL language detection enabled.'));
+    $this->drupalGet('admin/config/regional/language/configure');
+
+    drupal_static_reset('locale_url_outbound_alter');
+    drupal_static_reset('language_list');
+  }
+}
\ No newline at end of file
