diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleLibraryInfoAlterTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleLibraryInfoAlterTest.php new file mode 100644 index 0000000..d8a44ad --- /dev/null +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleLibraryInfoAlterTest.php @@ -0,0 +1,39 @@ + 'Javascript library localisation', + 'description' => 'Tests localization of the JavaScript libraries.', + 'group' => 'Locale', + ); + } + + function setUp() { + parent::setUp('locale', 'locale_test'); + } + + /** + * Verifies that the datepicker can be localized. + * + * @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.')); + } +} diff --git a/core/modules/locale/locale.datepicker.js b/core/modules/locale/locale.datepicker.js index 024c1e2..0efd20b 100644 --- a/core/modules/locale/locale.datepicker.js +++ b/core/modules/locale/locale.datepicker.js @@ -2,70 +2,80 @@ "use strict"; -$.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 +/** + * 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']); + } }; -$.datepicker.setDefaults($.datepicker.regional['drupal-locale']); })(jQuery); diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module index 35f8032..7ce8a2f 100644 --- a/core/modules/locale/locale.module +++ b/core/modules/locale/locale.module @@ -641,21 +641,28 @@ function locale_js_alter(&$javascript) { } } - /** +/** * Implement hook_library_info_alter(). * * Provides the language support for the jQuery UI Date Picker. */ function locale_library_info_alter(&$libraries, $module) { - global $language_interface; - if ($module == 'system' && isset($libraries['system']['ui.datepicker'])) { + if ($module == 'system' && isset($libraries['ui.datepicker'])) { + global $language_interface; + // 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_interface->direction == LANGUAGE_RTL, - 'firstDay' => variable_get('date_first_day', 0), + 'jquery' => array( + 'ui' => array( + 'datepicker' => array( + 'isRTL' => $language_interface->direction == LANGUAGE_RTL, + 'firstDay' => variable_get('date_first_day', 0), + ), + ), ), ), 'type' => 'setting', diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc index a43ff62..fa8b2f2 100644 --- a/core/modules/node/node.pages.inc +++ b/core/modules/node/node.pages.inc @@ -293,6 +293,15 @@ function node_form($form, &$form_state, Node $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