diff --git a/uc_attribute/uc_attribute.module b/uc_attribute/uc_attribute.module
index 03daf9e..f23f058 100644
--- a/uc_attribute/uc_attribute.module
+++ b/uc_attribute/uc_attribute.module
@@ -224,6 +224,92 @@ function uc_attribute_menu() {
 }
 
 /**
+ * Implementation of hook_locale().
+ */
+function uc_attribute_locale($op = 'groups', $group = NULL) {
+  switch ($op) {
+    case 'groups':
+      return array('uc_attribute' => t('Übercart attribute'));
+    case 'info':
+      $info['uc_attribute']['refresh callback'] = 'uc_attribute_locale_refresh';
+      $info['uc_attribute']['format'] = FALSE;
+      return $info;
+  }
+}
+
+/**
+ * Implementation of hook_locale refresh callback.
+ */
+function uc_attribute_locale_refresh() {
+  // Checks if i18nstrings module is enabled
+  if(!function_exists('i18nstrings_update')) return FALSE;
+
+  $attributes = db_query("
+    SELECT uca.aid,
+           uca.name,
+           uca.label,
+           uca.description
+    FROM   {uc_attributes} uca"
+  );
+
+  while ($attribute = db_fetch_object($attributes)) {
+    i18nstrings_update('uc_attribute:attribute:'.$attribute->aid.':name',$attribute->name);
+    i18nstrings_update('uc_attribute:attribute:'.$attribute->aid.':label',$attribute->label);
+    i18nstrings_update('uc_attribute:attribute:'.$attribute->aid.':description',$attribute->description);
+
+    $options = db_query("
+      SELECT ucao.oid,
+             ucao.name
+      FROM   {uc_attribute_options} ucao
+      WHERE  ucao.aid = %d",
+      array($attribute->aid)
+    );
+
+    while ($option = db_fetch_object($options)) {
+      i18nstrings_update('uc_attribute:option:'.$option->oid.':name',$option->name);
+    }
+  }
+
+  return TRUE; // Meaning it completed with no issues
+}
+
+/**
+ * Wrapper function for i18nstrings() if i18nstrings enabled.
+ * (Strongly inspired by this post http://drupal.org/node/609364 )
+ *
+ * @param $name
+ *   Name of the string, like "send_interval:$key:name"
+ * @param $string
+ *   String in default language
+ * @param $langcode
+ *   Optional language code to translate to, if not current page language
+ * @param $textgroup
+ *   Text group name for the string. It defaults to 'uc_attribute' for this module
+ */
+function uc_attribute_translate($name, $string, $langcode = NULL) {
+  return function_exists('i18nstrings') ? i18nstrings('uc_attribute:' . $name, $string, $langcode) : $string;
+}
+
+/**
+ * Translate an array of attributes and options as needed by the nodeapi
+ * hook.
+ *
+ * @param &$attributes
+ *   An array
+ */
+function uc_attribute_object_translate($attribute) {
+  $attribute->name        = uc_attribute_translate('attribute:'.$attribute->aid.':name',$attribute->name);
+  $attribute->label       = uc_attribute_translate('attribute:'.$attribute->aid.':label',$attribute->label);
+  $attribute->description = uc_attribute_translate('attribute:'.$attribute->aid.':description',$attribute->description);
+
+  foreach($attribute->options as $oid=>$option) {
+    $attribute->options[$oid]->name = uc_attribute_translate('option:'.$oid.':name',$option->name);
+  }
+
+  return $attribute;
+}
+
+/**
  * Access callback for editing a product class's attributes and options.
  */
 function uc_attribute_product_class_access() {
@@ -695,6 +781,13 @@ function uc_attribute_load($aid, $id = NULL, $type = '') {
         $attribute->label = $attribute->name;
       }
 
+      // Translate label and description if i18nstrings is installed
+      $attribute->label = uc_attribute_translate('attribute:'.$attribute->aid.':name', $attribute->label);
+
+      if(!empty($attribute->description)) {
+        $attribute->description = uc_attribute_translate('attribute:'.$attribute->aid.':description', $attribute->description);
+      }
+
       // Read option data.
       $result = db_query("
         SELECT    po.{$sql['id']}, po.oid, po.cost, po.price, po.weight, po.ordering, ao.name,
@@ -723,6 +816,9 @@ function uc_attribute_load($aid, $id = NULL, $type = '') {
     // Get its options, too.
     $attribute->options = array();
     while ($option = db_fetch_object($result)) {
+      // Translate option name if i18nstrings is installed
+      $option->name = uc_attribute_translate('option:'.$option->oid.'.:name',$option->name);
+
       $attribute->options[$option->oid] = $option;
     }
   }
@@ -1174,7 +1270,7 @@ function _uc_cart_product_get_options($item) {
   if (!empty($data['attributes']) && is_array($data['attributes'])) {
     foreach ($data['attributes'] as $aid => $selected) {
       if (isset($node->attributes[$aid])) {
-        $attribute = $node->attributes[$aid];
+        $attribute = uc_attribute_object_translate($node->attributes[$aid]);
         $name = _uc_attribute_get_name($attribute);
         // Only discrete options can affect the price of an item.
         if ($attribute->display && count($attribute->options)) {
@@ -1413,10 +1509,11 @@ function theme_uc_attribute_add_to_cart($form) {
  *   returned when $title is FALSE.
  */
 function _uc_attribute_get_name($attribute, $title = TRUE) {
-  if (!$title && $attribute->label == '<none>') {
-    return NULL;
-  }
-  else {
-    return (empty($attribute->label) || ($attribute->label == '<none>' && $title) ? $attribute->name : $attribute->label);
+  if (!$title && $attribute->label == '<none>') return NULL;
+
+  if (empty($attribute->label) || ($attribute->label == '<none>' && $title)) {
+    return uc_attribute_translate('attribute:'.$attribute->aid.':name', $attribute->name);
+  } else {
+    return uc_attribute_translate('attribute:'.$attribute->aid.':label', $attribute->label);
   }
 }
