diff --git a/includes/tmgmt.entity.inc b/includes/tmgmt.entity.inc
index 0bf2cf37eaec663511eace77db90997822bda4fa..de848fec80bb0da40a8962059bace1b2a86545d4 100755
--- a/includes/tmgmt.entity.inc
+++ b/includes/tmgmt.entity.inc
@@ -172,6 +172,16 @@ class TMGMTTranslator extends Entity {
   }

   /**
+   * @todo Remove this once http://drupal.org/node/1420364 is done.
+   */
+  public function getNotCanTranslateReason(TMGMTJob $job) {
+    if ($controller = $this->getController()) {
+      return $controller->getNotCanTranslateReason($job);
+    }
+    return FALSE;
+  }
+
+  /**
    * Retrieves a setting value from the translator settings. Pulls the default
    * values (if defined) from the plugin controller.
    *
diff --git a/includes/tmgmt.plugin.inc b/includes/tmgmt.plugin.inc
index a4ef99b05084a976e825e3006f350c1939746551..bee3d0f1d80cc8941f565d25ed736173ecb445d1 100755
--- a/includes/tmgmt.plugin.inc
+++ b/includes/tmgmt.plugin.inc
@@ -213,6 +213,19 @@ interface TMGMTTranslatorPluginControllerInterface extends TMGMTPluginBaseInterf
   public function canTranslate(TMGMTTranslator $translator, TMGMTJob $job);

   /**
+   * Return a reason why the translator is not able to translate this job.
+   *
+   * @param TMGMTJob $job
+   *   The job entity.
+   *
+   * Might be called when canTranslate() returns FALSE to get a reason that
+   * can be displayed to the user.
+   *
+   * @todo Remove this once http://drupal.org/node/1420364 is done.
+   */
+  public function getNotCanTranslateReason(TMGMTJob $job);
+
+  /**
    * Returns all available target languages that are supported by this service
    * when given a source language.
    *
@@ -309,6 +322,14 @@ abstract class TMGMTDefaultTranslatorPluginController extends TMGMTPluginBase im
   }

   /**
+   * Implements TMGMTTranslatorPluginControllerInterface::getNotCanTranslateReason().
+   */
+  public function getNotCanTranslateReason(TMGMTJob $job) {
+    $wrapper = entity_metadata_wrapper('tmgmt_job', $job);
+    return t('@translator can not translate from @source to @target.', array('@translator' => $job->getTranslator()->label(), '@source' => $wrapper->source_language->label(), '@target' => $wrapper->target_language->label()));
+  }
+
+  /**
    * Implements TMGMTTranslatorPluginControllerInterface::getNotAvailableReason().
    */
   public function getNotAvailableReason(TMGMTTranslator $translator) {
diff --git a/ui/includes/tmgmt_ui.pages.inc b/ui/includes/tmgmt_ui.pages.inc
index 043b8d59a9dcb9e136cb484b14c860bdfd1755f7..ba7f63f6d8d06c39da98ab7a79f641844966ecea 100644
--- a/ui/includes/tmgmt_ui.pages.inc
+++ b/ui/includes/tmgmt_ui.pages.inc
@@ -489,7 +489,7 @@ function tmgmt_job_form_validate($form, &$form_state) {
     form_set_error('translator', $translator->getNotAvailableReason());
   }
   elseif (!$translator->canTranslate($job)) {
-    form_set_error('translator', t('@translator can not translate from @source to @target.', array('@translator' => $translator->label(), '@source' => $wrapper->source_language->label(), '@target' => $wrapper->target_language->label())));
+    form_set_error('translator', $translator->getNotCanTranslateReason($job));
   }
 }

@@ -506,8 +506,7 @@ function tmgmt_ui_checkout_settings_form(&$form_state, TMGMTJob $job) {
   }
   // @todo: if the target language is not defined, the check will not work if the first language in the list is not available.
   elseif ($job->target_language && !$translator->canTranslate($job)) {
-    $wrapper = entity_metadata_wrapper('tmgmt_job', $job);
-    $form['#description'] = t('@translator can not translate from @source to @target.', array('@translator' => $job->getTranslator()->label(), '@source' => $wrapper->source_language->label(), '@target' => $wrapper->target_language->label()));
+    $form['#description'] = filter_xss($job->getTranslator()->getNotCanTranslateReason($job));
   }
   else {
     $controller = tmgmt_translator_ui_controller($translator->plugin);
