From 9da8b4187c3829877689f4c06451e5b2700a5858 Mon Sep 17 00:00:00 2001 From: Davi Lima Date: Sat, 16 Feb 2019 10:56:50 +0100 Subject: [PATCH 1/2] Fix bugs in Moment.js lazy loaded locales: - Avoid leaking lazyLoadMomentLocale to global namespace - Fix not incorrect formatting of mockup-i18n's currentLanguage - Fix widget breakage on IE11 due to lack of support for 'includes' --- mockup/patterns/moment/pattern.js | 66 +++++++++++++++++-------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/mockup/patterns/moment/pattern.js b/mockup/patterns/moment/pattern.js index d56a00a3cc..52c392c885 100644 --- a/mockup/patterns/moment/pattern.js +++ b/mockup/patterns/moment/pattern.js @@ -86,7 +86,42 @@ define([ 'mockup-i18n', 'moment' ], function($, Base, i18n, moment) { - lazyLoadMomentLocale(); + var currentLanguage = (new i18n()).currentLanguage; + + // From https://github.com/moment/moment/blob/3147fbc/src/test/moment/format.js#L463-L468 + var MOMENT_LOCALES = + 'ar-sa ar-tn ar az be bg bn bo br bs ca cs cv cy da de-at de dv el ' + + 'en-au en-ca en-gb en-ie en-nz eo es et eu fa fi fo fr-ca fr-ch fr fy ' + + 'gd gl he hi hr hu hy-am id is it ja jv ka kk km ko lb lo lt lv me mk ml ' + + 'mr ms-my ms my nb ne nl nn pl pt-br pt ro ru se si sk sl sq sr-cyrl ' + + 'sr sv sw ta te th tl-ph tlh tr tzl tzm-latn tzm uk uz vi zh-cn zh-tw'; + + lazyLoadMomentLocale(currentLanguage); + + function isLangSupported(lang) { + return MOMENT_LOCALES.split(' ').indexOf(lang) !== -1; + } + + function lazyLoadMomentLocale(lang) { + var LANG_FALLBACK = 'en'; + + if (lang === LANG_FALLBACK) { + // English locale is built-in, no need to load + return; + } + + // Format language as expect by Moment.js, neither POSIX (like TinyMCE) nor IETF + lang = lang.replace('_', '-').toLowerCase(); + + // Use language code as fallback, otherwise built-in English locale + lang = isLangSupported(lang) ? lang : lang.split('-')[0]; + lang = isLangSupported(lang) ? lang : LANG_FALLBACK; + if (lang === LANG_FALLBACK) { + return; + } + + require(['moment-url/' + lang]); + } var Moment = Base.extend({ name: 'moment', @@ -109,7 +144,6 @@ define([ if (!date || date === 'None') { return; } - var currentLanguage = (new i18n()).currentLanguage; if (currentLanguage in self.moment_i18n_map) { currentLanguage = self.moment_i18n_map[currentLanguage]; } @@ -147,31 +181,3 @@ define([ return Moment; }); - -function lazyLoadMomentLocale() { - var BUILTIN_FALLBACK = 'en'; - var lang = document.querySelector('html').lang || BUILTIN_FALLBACK; - - if (lang === 'en') { - // English locale is built-in, no need to load - return; - } - - // Taken from https://github.com/moment/moment/blob/3147fbc486209f0b479dc0b29672d4c2ef39cf43/src/test/moment/format.js#L463-L468 - var MOMENT_LOCALES = - 'ar-sa ar-tn ar az be bg bn bo br bs ca cs cv cy da de-at de dv el ' + - 'en-au en-ca en-gb en-ie en-nz eo es et eu fa fi fo fr-ca fr-ch fr fy ' + - 'gd gl he hi hr hu hy-am id is it ja jv ka kk km ko lb lo lt lv me mk ml ' + - 'mr ms-my ms my nb ne nl nn pl pt-br pt ro ru se si sk sl sq sr-cyrl ' + - 'sr sv sw ta te th tl-ph tlh tr tzl tzm-latn tzm uk uz vi zh-cn zh-tw'; - - lang = MOMENT_LOCALES.split(' ').includes(lang) ? lang : lang.split('-')[0]; - lang = MOMENT_LOCALES.split(' ').includes(lang) ? lang : BUILTIN_FALLBACK; - - if (lang === BUILTIN_FALLBACK) { - // English locale is built-in, no need to load - return; - } - - require(['moment-url/' + lang]); -} From 4211674f2e93a1323fcd1c7c245cc1864ab5358b Mon Sep 17 00:00:00 2001 From: Davi Lima Date: Sat, 16 Feb 2019 11:00:17 +0100 Subject: [PATCH 2/2] Add towncrier entry (changelog) --- news/894.fix | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 news/894.fix diff --git a/news/894.fix b/news/894.fix new file mode 100644 index 0000000000..f0541c555d --- /dev/null +++ b/news/894.fix @@ -0,0 +1,2 @@ +* Fix bugs in Moment.js lazy locales, affecting: language variant fallbacks, variable leak to global namespace, IE11 widget support + [davilima6]