diff --git a/modules/locale/locale.datepicker.js b/modules/locale/locale.datepicker.js index 81f1e17..4deae28 100644 --- a/modules/locale/locale.datepicker.js +++ b/modules/locale/locale.datepicker.js @@ -1,69 +1,79 @@ (function ($) { -$.datepicker.regional['drupal-locale'] = { - closeText: Drupal.t('Done'), - prevText: Drupal.t('Prev'), - nextText: Drupal.t('Next'), - currentText: Drupal.t('Today'), - monthNames: [ - Drupal.t('January'), - Drupal.t('February'), - Drupal.t('March'), - Drupal.t('April'), - Drupal.t('May'), - Drupal.t('June'), - Drupal.t('July'), - Drupal.t('August'), - Drupal.t('September'), - Drupal.t('October'), - Drupal.t('November'), - Drupal.t('December') - ], - monthNamesShort: [ - Drupal.t('Jan'), - Drupal.t('Feb'), - Drupal.t('Mar'), - Drupal.t('Apr'), - Drupal.t('May'), - Drupal.t('Jun'), - Drupal.t('Jul'), - Drupal.t('Aug'), - Drupal.t('Sep'), - Drupal.t('Oct'), - Drupal.t('Nov'), - Drupal.t('Dec') - ], - dayNames: [ - Drupal.t('Sunday'), - Drupal.t('Monday'), - Drupal.t('Tuesday'), - Drupal.t('Wednesday'), - Drupal.t('Thursday'), - Drupal.t('Friday'), - Drupal.t('Saturday') - ], - dayNamesShort: [ - Drupal.t('Sun'), - Drupal.t('Mon'), - Drupal.t('Tue'), - Drupal.t('Wed'), - Drupal.t('Thu'), - Drupal.t('Fri'), - Drupal.t('Sat') - ], - dayNamesMin: [ - Drupal.t('Su'), - Drupal.t('Mo'), - Drupal.t('Tu'), - Drupal.t('We'), - Drupal.t('Th'), - Drupal.t('Fr'), - Drupal.t('Sa') - ], - dateFormat: Drupal.t('mm/dd/yy'), - firstDay: Drupal.settings.jqueryuidatepicker.firstDay, - isRTL: Drupal.settings.jqueryuidatepicker.rtl -}; -$.datepicker.setDefaults($.datepicker.regional['drupal-locale']); +/** + * Attaches language support to the jQuery UI datepicker component. + */ +Drupal.behaviors.localeDatepicker = { + attach: function(context, settings) { + // This code accesses Drupal.settings and localized strings via Drupal.t(). + // So this code should run after these are initialized. By placing it in an + // attach behavior this is assured. + $.datepicker.regional['drupal-locale'] = $.extend({ + closeText: Drupal.t('Done'), + prevText: Drupal.t('Prev'), + nextText: Drupal.t('Next'), + currentText: Drupal.t('Today'), + monthNames: [ + Drupal.t('January'), + Drupal.t('February'), + Drupal.t('March'), + Drupal.t('April'), + Drupal.t('May'), + Drupal.t('June'), + Drupal.t('July'), + Drupal.t('August'), + Drupal.t('September'), + Drupal.t('October'), + Drupal.t('November'), + Drupal.t('December') + ], + monthNamesShort: [ + Drupal.t('Jan'), + Drupal.t('Feb'), + Drupal.t('Mar'), + Drupal.t('Apr'), + Drupal.t('May'), + Drupal.t('Jun'), + Drupal.t('Jul'), + Drupal.t('Aug'), + Drupal.t('Sep'), + Drupal.t('Oct'), + Drupal.t('Nov'), + Drupal.t('Dec') + ], + dayNames: [ + Drupal.t('Sunday'), + Drupal.t('Monday'), + Drupal.t('Tuesday'), + Drupal.t('Wednesday'), + Drupal.t('Thursday'), + Drupal.t('Friday'), + Drupal.t('Saturday') + ], + dayNamesShort: [ + Drupal.t('Sun'), + Drupal.t('Mon'), + Drupal.t('Tue'), + Drupal.t('Wed'), + Drupal.t('Thu'), + Drupal.t('Fri'), + Drupal.t('Sat') + ], + dayNamesMin: [ + Drupal.t('Su'), + Drupal.t('Mo'), + Drupal.t('Tu'), + Drupal.t('We'), + Drupal.t('Th'), + Drupal.t('Fr'), + Drupal.t('Sa') + ], + dateFormat: Drupal.t('mm/dd/yy'), + firstDay: 0, + isRTL: 0 + }, Drupal.settings.jquery.ui.datepicker); + $.datepicker.setDefaults($.datepicker.regional['drupal-locale']); + } + }; })(jQuery); diff --git a/modules/locale/locale.module b/modules/locale/locale.module index 0788461..c62225a 100644 --- a/modules/locale/locale.module +++ b/modules/locale/locale.module @@ -920,15 +920,22 @@ function locale_css_alter(&$css) { * Provides the language support for the jQuery UI Date Picker. */ function locale_library_alter(&$libraries, $module) { - global $language; - if ($module == 'system' && isset($libraries['system']['ui.datepicker'])) { + if ($module == 'system' && isset($libraries['ui.datepicker'])) { + global $language; + // locale.datepicker.js should be added in the JS_LIBRARY group, so that + // this attach behavior will execute early. JS_LIBRARY is the default for + // hook_library_info_alter(), thus does not have to be specified explicitly. $datepicker = drupal_get_path('module', 'locale') . '/locale.datepicker.js'; - $libraries['system']['ui.datepicker']['js'][$datepicker] = array('group' => JS_THEME); - $libraries['system']['ui.datepicker']['js'][] = array( + $libraries['ui.datepicker']['js'][$datepicker] = array(); + $libraries['ui.datepicker']['js'][] = array( 'data' => array( - 'jqueryuidatepicker' => array( - 'rtl' => $language->direction == LANGUAGE_RTL, - 'firstDay' => variable_get('date_first_day', 0), + 'jquery' => array( + 'ui' => array( + 'datepicker' => array( + 'isRTL' => $language->direction == LANGUAGE_RTL, + 'firstDay' => variable_get('date_first_day', 0), + ), + ), ), ), 'type' => 'setting', diff --git a/modules/locale/locale.test b/modules/locale/locale.test index ca94556..0b39ecd 100644 --- a/modules/locale/locale.test +++ b/modules/locale/locale.test @@ -180,6 +180,36 @@ class LocaleConfigurationTest extends DrupalWebTestCase { } /** + * Functional test for localization of the javascript libraries. + * + * Currently only the jQuery datepicker is localized, using Drupal translations. + */ +class LocaleLibraryInfoAlterTest extends DrupalWebTestCase { + public static function getInfo() { + return array( + 'name' => 'Javascript library localisation', + 'description' => 'Tests the localisation of javascript libraries.', + 'group' => 'Locale', + ); + } + + function setUp() { + parent::setUp('locale', 'locale_test'); + } + + /** + * Verify that locale_library_info_alter adds localisation to the datepicker. + * + * @see locale_library_info_alter() + */ + public function testLibraryInfoAlter() { + drupal_add_library('system', 'ui.datepicker'); + $scripts = drupal_get_js(); + $this->assertTrue(strpos($scripts, 'locale.datepicker.js'), t('locale.datepicker.js added to scripts.')); + } +} + +/** * Functional tests for JavaScript parsing for translatable strings. */ class LocaleJavascriptTranslationTest extends DrupalWebTestCase { @@ -1330,7 +1360,6 @@ class LocaleUninstallFrenchFunctionalTest extends LocaleUninstallFunctionalTest } } - /** * Functional tests for the language switching feature. */ @@ -2549,6 +2578,7 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase { } } } + /** * Functional tests for localizing date formats. */ diff --git a/modules/node/node.pages.inc b/modules/node/node.pages.inc index 89a1593..0246965 100644 --- a/modules/node/node.pages.inc +++ b/modules/node/node.pages.inc @@ -229,6 +229,15 @@ function node_form($form, &$form_state, $node) { '#maxlength' => 25, '#description' => t('Format: %time. The date format is YYYY-MM-DD and %timezone is the time zone offset from UTC. Leave blank to use the time of form submission.', array('%time' => !empty($node->date) ? date_format(date_create($node->date), 'Y-m-d H:i:s O') : format_date($node->created, 'custom', 'Y-m-d H:i:s O'), '%timezone' => !empty($node->date) ? date_format(date_create($node->date), 'O') : format_date($node->created, 'custom', 'O'))), '#default_value' => !empty($node->date) ? $node->date : '', + '#attached' => array( + 'library' => array(array('system', 'ui.datepicker')), + 'js' => array(array( + 'data' => "jQuery(function ($) { + $('#edit-date').datepicker(); + });", + 'type' => 'inline', + )) + ), ); // Node options for administrators