diff --git a/components/date.inc b/components/date.inc
index 7160002..465be97 100644
--- a/components/date.inc
+++ b/components/date.inc
@@ -453,12 +453,12 @@ 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 0000000..b90f0b9
--- /dev/null
+++ b/tests/WebformTranslationTestCase.test
@@ -0,0 +1,180 @@
+<?php
+
+/**
+ * @file
+ * Webform module translation tests.
+ */
+class WebformTranslationTestCase extends WebformTestCase {
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => t('Webform translation'),
+      'description' => t('Translate webform components.'),
+      'group' => t('Webform'),
+    );
+  }
+
+  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 "Webform" content type to use multilingual support with
+    // translation.
+    $this->drupalGet('admin/structure/types/manage/webform');
+    $edit = array();
+    $edit['language_content_type'] = 2;
+    $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.');
+
+    // Enable URL language detection and selection.
+    $edit = array('language[enabled][locale-url]' => TRUE);
+    $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
+    $this->assertRaw(t('Language negotiation configuration saved.'), 'URL language detection enabled.');
+    drupal_static_reset('locale_url_outbound_alter');
+
+    // 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');
+  }
+
+  /**
+   * Webform module component tests.
+   */
+  public function testWebformComponentTranslation() {
+    $settings = array(
+      'type' => 'webform',
+      'language'  => 'fr',
+      '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(),
+    );
+
+    $cid = 0;
+    foreach ($this->webformComponents() as $key => $component_info) {
+      if ($key == 'date') {
+        $component_info['component']['extra']['start_date'] = '+1 day';
+      }
+      $cid++;
+      $settings['webform']['components'][$cid] = $component_info['component'];
+      $settings['webform']['components'][$cid]['cid'] = $cid;
+      $settings['webform']['components'][$cid]['pid'] = 0;
+    }
+    $node = $this->drupalCreateNode($settings);
+    $this->drupalGet('/fr/node/' . $node->nid);
+
+    $submission_values = array(
+      'date' => array('day' => '1', 'month' => '1', 'year' => date('Y'))
+    );
+    $edit = $this->webformPost($submission_values);
+    $this->drupalPost('fr/node/' . $node->nid, $edit, 'Submit', array(), array(), 'webform-client-form-' . $node->nid);
+    $date = date('l \f\r, F j, Y', strtotime('+1 day'));
+    $this->assertRaw('The entered date must be ' . $date . ' or later.');
+  }
+
+  /**
+   * Installs the specified language, or enables it if it is already installed.
+   *
+   * @param $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 $langcode
+   *   Language prefix to translate given string.
+   */
+  protected function translateString($string, $langcode) {
+    t($string, array(), array('langcode' => $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 1803840..0455e56 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
