diff --git a/l10n_community/translate.inc b/l10n_community/translate.inc
index cd5e06d..53796eb 100644
--- a/l10n_community/translate.inc
+++ b/l10n_community/translate.inc
@@ -749,6 +749,49 @@ function theme_l10n_community_translate_translation_list($variables) {
   return $output;
 }
 
+// = Translation form validation ===============================================
+
+/**
+ * Form validation callback for l10n_community_translate_form().
+ */
+function l10n_community_translate_form_validate($form, &$form_state) {
+  // Load original strings.
+  $originals = db_select('l10n_server_string', 's')
+    ->fields('s')
+    ->condition('sid', array_keys($form_state['values']['strings']))
+    ->execute()
+    ->fetchAllKeyed();
+
+  // Iterate outer structure built in l10n_community_translate_form().
+  foreach ($form_state['values']['strings'] as $sid => $string) {
+    $pattern = '/([!@%]|<(ins|del)>[!@%]<\/(ins|del)>)([\w-]+|<(ins|del)>[\w-]+<\/(ins|del)>)/';
+    $matches = array();
+
+    // If there are variable in the original string. Check in new suggestions.
+    if (preg_match_all($pattern, $originals[$sid], $matches)) {
+      foreach ($string as $tid => $options) {
+        // Only process new suggestions.
+        if (isset($options['value']) && is_array($options['value']) && $tid === 'new') {
+          $not_found = array();
+          foreach ($options['value'] as $value) {
+            if ($value !== t('<New translation>')) {
+              foreach ($matches[0] as $match) {
+                if (!strstr($value, $match)) {
+                  $not_found[] = $match;
+                }
+              }
+            }
+          }
+          if ($not_found) {
+            form_set_error(NULL, t('Missing variable(s) !variables', array('!variables' => implode(', ', $not_found))));
+          }
+        }
+      }
+
+    }
+  }
+}
+
 // = Translation form submission ===============================================
 
 /**
