diff --git a/modules/system.rules.inc b/modules/system.rules.inc
index f9cf195..db1ffc5 100644
--- a/modules/system.rules.inc
+++ b/modules/system.rules.inc
@@ -104,6 +104,7 @@ function rules_system_action_info() {
           'type' => 'text',
           'label' => t('Message'),
           'sanitize' => TRUE,
+          'translatable' => TRUE,
         ),
         'type' => array(
           'type' => 'token',
diff --git a/rules.module b/rules.module
index b99ce96..be68562 100644
--- a/rules.module
+++ b/rules.module
@@ -578,6 +578,7 @@ function rules_entity_info() {
         'name' => 'name',
         'label' => 'label',
       ),
+      'module' => 'rules',
       'static cache' => TRUE,
       'bundles' => array(),
       'configuration' => TRUE,
diff --git a/rules_i18n/rules_i18n.i18n.inc b/rules_i18n/rules_i18n.i18n.inc
new file mode 100644
index 0000000..270d6fd
--- /dev/null
+++ b/rules_i18n/rules_i18n.i18n.inc
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @file
+ * Internationalization integration based upon the entity API i18n stuff.
+ */
+
+/**
+ * Rules i18n integration controller.
+ */
+class RulesI18nStringController extends EntityDefaultI18nStringController {
+
+  /**
+   * Overriden to customize i18n object info.
+   *
+   * @see EntityDefaultI18nStringController::hook_object_info()
+   */
+  public function hook_object_info() {
+    $info = parent::hook_object_info();
+    $info['rules_config']['class'] = 'RulesI18nStringObjectWrapper';
+    return $info;
+  }
+
+  /**
+   * Overriden to customize the used menu wildcard.
+   */
+  protected function menuWildcard() {
+    return '%rules_config';
+  }
+}
+
+/**
+ * Custom I18n String object wrapper, which register custom properties per config.
+ */
+class RulesI18nStringObjectWrapper extends i18n_string_object_wrapper {
+
+  /**
+   * Get translatable properties
+   */
+  protected function build_properties() {
+    $strings = parent::build_properties();
+    $properties = array();
+
+    foreach ($this->object as $element) {
+      foreach ($element->pluginParameterInfo() as $name => $info) {
+        // Add in all directly provided input variables.
+        if (!empty($info['translatable']) && isset($element->settings[$name])) {
+          $properties[$element->elementId() . '.' . $name] = array(
+            'title' => t('@label @id @name', array('@label' => $element->label(), '@id' => $element->elementId(), '@name' => $name)),
+            'string' => $element->settings[$name],
+          );
+        }
+      }
+    }
+    $strings[$this->get_textgroup()]['rules_config'][$this->object->name] = $properties;
+    return $strings;
+  }
+}
diff --git a/rules_i18n/rules_i18n.info b/rules_i18n/rules_i18n.info
new file mode 100644
index 0000000..bc6ba32
--- /dev/null
+++ b/rules_i18n/rules_i18n.info
@@ -0,0 +1,7 @@
+name = Rules translation
+description = Allows translating rules.
+dependencies[] = rules
+dependencies[] = i18n_string
+package = Multilingual - Internationalization
+core = 7.x
+files[] = rules_i18n.i18n.inc
\ No newline at end of file
diff --git a/rules_i18n/rules_i18n.module b/rules_i18n/rules_i18n.module
new file mode 100644
index 0000000..5df831a
--- /dev/null
+++ b/rules_i18n/rules_i18n.module
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Rules i18n integration.
+ */
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function rules_i18n_entity_info_alter(&$info) {
+  // Enable i18n support via the entity API.
+  $info['rules_config']['i18n controller class'] = 'RulesI18nStringController';
+}
+
+/**
+ * Implements hook_rules_config_insert().
+ */
+function rules_i18n_rules_config_insert($rules_config) {
+  i18n_string_object_update('rules_config', $rules_config);
+}
+
+/**
+ * Implements hook_rules_config_update().
+ */
+function rules_i18n_rules_config_update($rules_config) {
+  // Account for name changes.
+  if ($rules_config->original->name != $rules_config->name) {
+    i18n_string_update_context("rules:rules_config:{$rules_config->original->name}:*", "rules:rules_config:{$rules_config->name}:*");
+  }
+  // @todo: Care about difference between the strings and delete gone strings...
+  i18n_object($type, $rules_config)->strings_update($options);
+}
+
+/**
+ * Implements hook_rules_config_delete().
+ */
+function rules_i18n_rules_config_delete($rules_config) {
+  i18n_string_object_remove('rules_config', $rules_config);
+}
