diff --git a/modules/tax/commerce_tax.i18n.inc b/modules/tax/commerce_tax.i18n.inc
new file mode 100644
index 0000000..77a96c3
--- /dev/null
+++ b/modules/tax/commerce_tax.i18n.inc
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @file
+ * Internationalization (i18n) integration for the Commerce tax module.
+ */
+
+/**
+ * Implements hook_i18n_object_info().
+ */
+function commerce_tax_i18n_object_info() {
+  $info['commerce_tax_rate'] = array(
+    'title' => t('Commerce tax rate'),
+    'key' => 'rules_component',
+    'class' => 'i18n_string_object_wrapper',
+    'string translation' => array(
+      'textgroup' => 'commerce_tax',
+      'type' => 'name',
+      'properties' => array(
+        'title' => t('Title'),
+        'display_title' => t('Display title', array(), array('context' => 'title for display purposes')),
+        'description' => t('Description'),
+      ),
+    ),
+  );
+  $info['commerce_tax_type'] = array(
+    'title' => t('Commerce tax type'),
+    'key' => 'rule',
+    'class' => 'i18n_string_object_wrapper',
+    'string translation' => array(
+      'textgroup' => 'commerce_tax',
+      'type' => 'name',
+      'properties' => array(
+        'title' => t('Title'),
+        'display_title' => t('Display title', array(), array('context' => 'title for display purposes')),
+        'description' => t('Description'),
+      ),
+    ),
+  );
+  return $info;
+}
+
+/**
+ * Implements hook_i18n_string_info().
+ */
+function commerce_tax_i18n_string_info() {
+  $groups['commerce_tax'] = array(
+    'title' => t('Commerce Tax'),
+    'description' => t("Translatable user-defined strings of the commerce tax module."),
+    'format' => FALSE, // This group doesn't have strings with format
+    'list' => FALSE, // This group cannot list all strings
+  );
+  return $groups;
+}
+
+/**
+ * Implements hook_i18n_string_objects().
+ */
+function commerce_tax_i18n_string_objects($type) {
+  if ($type == 'commerce_tax_rate') {
+    $query = db_select('commerce_tax_rate', 'ctr')
+      ->fields('ctr', array('name', 'title', 'display_title', 'description'));
+    $query->addExpression("CONCAT('commerce_tax_rate_', ctr.name)", 'rules_component');
+    return $query->execute()
+      ->fetchAllAssoc('rules_component', PDO::FETCH_ASSOC);
+  }
+  if ($type == 'commerce_tax_type') {
+    $query = db_select('commerce_tax_type', 'ctt')
+      ->fields('ctt', array('name', 'title', 'display_title', 'description'));
+    $query->addExpression("CONCAT('commerce_tax_type_', ctt.name)", 'rule');
+    return $query->execute()
+      ->fetchAllAssoc('rule', PDO::FETCH_ASSOC);
+  }
+}
diff --git a/modules/tax/commerce_tax.module b/modules/tax/commerce_tax.module
index bb56e77..dc59790 100644
--- a/modules/tax/commerce_tax.module
+++ b/modules/tax/commerce_tax.module
@@ -76,6 +76,11 @@ function commerce_tax_types() {
         );
 
         $tax_types[$name] = array_merge($defaults, $tax_type);
+        if (module_exists('i18n_string')) {
+          // Translate user-defined strings.
+          global $language;
+          $tax_types[$name] = i18n_object('commerce_tax_type', $tax_types[$name])->translate($language->language, array('sanitize' => FALSE));
+        }
       }
     }
 
@@ -170,6 +175,11 @@ function commerce_tax_rates() {
         );
 
         $tax_rates[$name] = array_merge($defaults, $tax_rate);
+        if (module_exists('i18n_string')) {
+          // Translate user-defined strings.
+          global $language;
+          $tax_rates[$name] = i18n_object('commerce_tax_rate', $tax_rates[$name])->translate($language->language, array('sanitize' => FALSE));
+        }
       }
     }
 
