diff --git a/src/Calendar.js b/src/Calendar.js index a875653..2a544bb 100644 --- a/src/Calendar.js +++ b/src/Calendar.js @@ -64,26 +64,34 @@ function Calendar(element, instanceOptions) { // ----------------------------------------------------------------------------------- // Apply overrides to the current language's data - var langData = createObject( // make a cheap clone - moment.langData(options.lang) - ); + + // Returns moment's internal locale data. If doesn't exist, returns English. + // Works with moment-pre-2.8 + function getLocaleData(langCode) { + var f = moment.localeData || moment.langData; + return f.call(moment, langCode) || + f.call(moment, 'en'); // the newer localData could return null, so fall back to en + } + + + var localeData = createObject(getLocaleData(options.lang)); // make a cheap copy if (options.monthNames) { - langData._months = options.monthNames; + localeData._months = options.monthNames; } if (options.monthNamesShort) { - langData._monthsShort = options.monthNamesShort; + localeData._monthsShort = options.monthNamesShort; } if (options.dayNames) { - langData._weekdays = options.dayNames; + localeData._weekdays = options.dayNames; } if (options.dayNamesShort) { - langData._weekdaysShort = options.dayNamesShort; + localeData._weekdaysShort = options.dayNamesShort; } if (options.firstDay != null) { - var _week = createObject(langData._week); // _week: { dow: # } + var _week = createObject(localeData._week); // _week: { dow: # } _week.dow = options.firstDay; - langData._week = _week; + localeData._week = _week; } @@ -116,7 +124,12 @@ function Calendar(element, instanceOptions) { mom = fc.moment.parseZone.apply(null, arguments); // let the input decide the zone } - mom._lang = langData; + if ('_locale' in mom) { // moment 2.8 and above + mom._locale = localeData; + } + else { // pre-moment-2.8 + mom._lang = localeData; + } return mom; }; @@ -204,7 +217,7 @@ function Calendar(element, instanceOptions) { // a function that returns a formatStr // TODO: in future, precompute this if (typeof formatStr === 'function') { - formatStr = formatStr.call(t, options, langData); + formatStr = formatStr.call(t, options, localeData); } return formatRange(m1, m2, formatStr, null, options.isRTL); @@ -216,7 +229,7 @@ function Calendar(element, instanceOptions) { // a function that returns a formatStr // TODO: in future, precompute this if (typeof formatStr === 'function') { - formatStr = formatStr.call(t, options, langData); + formatStr = formatStr.call(t, options, localeData); } return formatDate(mom, formatStr); diff --git a/src/date-formatting.js b/src/date-formatting.js index ddf3e26..3c87c36 100644 --- a/src/date-formatting.js +++ b/src/date-formatting.js @@ -72,12 +72,15 @@ function formatDateWithChunk(date, chunk) { // If the dates are the same as far as the format string is concerned, just return a single // rendering of one date, without any separator. function formatRange(date1, date2, formatStr, separator, isRTL) { + var localeData; date1 = fc.moment.parseZone(date1); date2 = fc.moment.parseZone(date2); + localeData = (date1.localeData || date1.lang).call(date1); // works with moment-pre-2.8 + // Expand localized format strings, like "LL" -> "MMMM D YYYY" - formatStr = date1.lang().longDateFormat(formatStr) || formatStr; + formatStr = localeData.longDateFormat(formatStr) || formatStr; // BTW, this is not important for `formatDate` because it is impossible to put custom tokens // or non-zero areas in Moment's localized format strings.