diff --git a/components/date.inc b/components/date.inc
index 2268f357..3e13b671 100644
--- a/components/date.inc
+++ b/components/date.inc
@@ -458,12 +458,16 @@ function webform_validate_date($element, $form_state) {
 
     // Check that the date is after the start date.
     if ($start_date !== FALSE && $timestamp < $start_date) {
-      form_error($element, t('The entered date must be @start_date or later.', array('@start_date' => date($format, $start_date))));
+      form_error($element, t('The entered date must be @start_date or later.', array(
+        '@start_date' => format_date($start_date, 'custom', $format),
+      )));
     }
 
     // Check that the date is before the end date.
     if ($end_date !== FALSE && $timestamp > $end_date) {
-      form_error($element, t('The entered date must be @end_date or earlier.', array('@end_date' => date($format, $end_date))));
+      form_error($element, t('The entered date must be @end_date or earlier.', array(
+        '@end_date' => format_date($end_date, 'custom', $format),
+      )));
     }
   }
   elseif ($element['#required']) {
diff --git a/tests/WebformTranslationTestCase.test b/tests/WebformTranslationTestCase.test
new file mode 100644
index 00000000..5324631d
--- /dev/null
+++ b/tests/WebformTranslationTestCase.test
@@ -0,0 +1,207 @@
+<?php
+
+/**
+ * @file
+ * Webform module translation tests.
+ */
+
+/**
+ * Class definition WebformTranslationTestCase.
+ */
+class WebformTranslationTestCase extends WebformTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => t('Webform translation'),
+      'description' => t('Translate webform components.'),
+      'group' => t('Webform'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp($added_modules = array()) {
+    parent::setUp(array('locale', 'translation'));
+    // Setup users.
+    $admin_permissions = array(
+      'bypass node access',
+      'administer nodes',
+      'administer languages',
+      'administer content types',
+      'administer blocks',
+      'access administration pages',
+      'translate content',
+      'create webform content',
+      'edit any webform content',
+      'access all webform results',
+      'edit all webform submissions',
+      'delete all webform submissions',
+      'administer site configuration',
+      'translate interface',
+    );
+    $this->admin_user = $this->drupalCreateUser($admin_permissions);
+    $this->drupalLogin($this->admin_user);
+
+    // Add languages.
+    $this->addLanguage('en');
+    $this->addLanguage('fr');
+
+    // Set fr as a default language.
+    $this->drupalGet('admin/config/regional/language');
+    $edit = array();
+    $edit['site_default'] = 'fr';
+    $this->drupalPost(NULL, $edit, t('Save configuration'));
+    $this->assertRaw(t('Configuration saved.'), 'Configuration saved.');
+    $fr_is_default_language = strpos($this->drupalGetContent(), 'name="site_default" value="fr" checked="checked"');
+    $this->assertTrue($fr_is_default_language !== FALSE, 'FR Language was set default successfully.');
+
+    // Set "Webform" content type to use default language (fr).
+    $this->drupalGet('admin/structure/types/manage/webform');
+    $edit = array();
+    $edit['language_content_type'] = 0;
+    $this->drupalPost(NULL, $edit, t('Save content type'));
+    $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Webform')), 'Webform content type has been updated.');
+
+    // Translate date format.
+    $edit = array('date_format_short' => 'l, F j, Y - H:i');
+    $this->drupalPost('admin/config/regional/date-time/locale/fr/edit', $edit, t('Save configuration'));
+
+    $date_part = date('l', strtotime('+1 day'));
+    $this->translateString($date_part, 'fr');
+
+    $date_part = date('l', strtotime('+32 day'));
+    $this->translateString($date_part, 'fr');
+  }
+
+  /**
+   * Webform module date component translation tests.
+   */
+  public function testWebformDateComponentTranslation() {
+    $settings = array(
+      'type' => 'webform',
+      'uid' => '1',
+      'status' => '1',
+      'promote' => '1',
+      'moderate' => '0',
+      'sticky' => '0',
+      'tnid' => '0',
+      'translate' => '0',
+      'title' => 'Test Webform',
+      'log' => '',
+      'format' => '1',
+      'webform' => array(
+        'confirmation' => 'Thanks!',
+      ) + webform_node_defaults(),
+    );
+
+    $components = $this->webformComponents();
+    $component_info = $components['date'];
+
+    // Add a date field.
+    $cid = 1;
+    $component_info['component']['extra']['start_date'] = '+1 day';
+    $component_info['component']['extra']['end_date'] = '+32 day';
+    $settings['webform']['components'][$cid] = $component_info['component'];
+    $settings['webform']['components'][$cid]['cid'] = $cid;
+    $settings['webform']['components'][$cid]['pid'] = 0;
+
+    $node = $this->drupalCreateNode($settings);
+    $test_dates = array(
+      array(
+        'date' => strtotime('-1 day'),
+        'message' => 'The entered date must be ' . date('l \f\r, F j, Y', strtotime('+1 day')) . ' or later.',
+      ),
+      array(
+        'date' => strtotime('+33 days'),
+        'message' => 'The entered date must be ' . date('l \f\r, F j, Y', strtotime('+32 day')) . ' or earlier.',
+      ),
+    );
+
+    foreach ($test_dates as $date_details) {
+      $this->drupalGet('/node/' . $node->nid);
+      $date = $date_details['date'];
+      $submission_values['date'] = array(
+        'day' => date('j', $date),
+        'month' => date('n', $date),
+        'year' => date('Y', $date),
+      );
+      $edit = $this->webformPost($submission_values);
+      $this->drupalPost('node/' . $node->nid, $edit, 'Submit', array(), array(), 'webform-client-form-' . $node->nid);
+      $this->assertRaw($date_details['message']);
+    }
+  }
+
+  /**
+   * Installs the specified language, or enables it if it is already installed.
+   *
+   * @param string $language_code
+   *   The language code to check.
+   */
+  protected function addLanguage($language_code) {
+    // Check to make sure that language has not already been installed.
+    $this->drupalGet('admin/config/regional/language');
+
+    if (strpos($this->drupalGetContent(), 'enabled[' . $language_code . ']') === FALSE) {
+      // Doesn't have language installed so add it.
+      $edit = array();
+      $edit['langcode'] = $language_code;
+      $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
+
+      // Make sure we are not using a stale list.
+      drupal_static_reset('language_list');
+      $languages = language_list('language');
+      $this->assertTrue(array_key_exists($language_code, $languages), 'Language was installed successfully.');
+
+      if (array_key_exists($language_code, $languages)) {
+        $this->assertRaw(t('The language %language has been created and can now be used. More information is available on the <a href="@locale-help">help screen</a>.', array('%language' => $languages[$language_code]->name, '@locale-help' => url('admin/help/locale'))), 'Language has been created.');
+      }
+    }
+    elseif ($this->xpath('//input[@type="checkbox" and @name=:name and @checked="checked"]', array(':name' => 'enabled[' . $language_code . ']'))) {
+      // It's installed and enabled. No need to do anything.
+      $this->assertTrue(TRUE, 'Language [' . $language_code . '] already installed and enabled.');
+    }
+    else {
+      // It's installed but not enabled. Enable it.
+      $this->assertTrue(TRUE, 'Language [' . $language_code . '] already installed.');
+      $this->drupalPost(NULL, array('enabled[' . $language_code . ']' => TRUE), t('Save configuration'));
+      $this->assertRaw(t('Configuration saved.'), 'Language successfully enabled.');
+    }
+  }
+
+  /**
+   * Helper to add interface translation.
+   *
+   * @param string $string
+   *   String to translate.
+   * @param string $langcode
+   *   Language prefix to translate given string.
+   */
+  protected function translateString($string, $langcode) {
+    locale($string, NULL, $langcode);
+    // Reset locale cache.
+    locale_reset();
+
+    $search = array(
+      'string' => $string,
+      'language' => 'all',
+      'translation' => 'all',
+      'group' => 'all',
+    );
+    $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
+    // Assume this is the only result, given the random name.
+    $this->clickLink(t('edit'));
+    // No t() here, it's surely not translated yet.
+    $this->assertText($string, 'name found on edit screen.');
+    $edit = array(
+      "translations[$langcode]" => $string . ' ' . $langcode,
+    );
+    $this->drupalPost(NULL, $edit, t('Save translations'));
+    $this->assertText(t('The string has been saved.'), 'The string has been saved.');
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
+  }
+
+}
diff --git a/webform.info b/webform.info
index 18038401..0455e564 100644
--- a/webform.info
+++ b/webform.info
@@ -39,3 +39,4 @@ files[] = tests/WebformGeneralTestCase.test
 files[] = tests/WebformPermissionsTestCase.test
 files[] = tests/WebformSubmissionTestCase.test
 files[] = tests/WebformTestCase.test
+files[] = tests/WebformTranslationTestCase.test
