diff --git a/lib/amd/build/str.min.js b/lib/amd/build/str.min.js
index 210094284a4..968475bfb2e 100644
--- a/lib/amd/build/str.min.js
+++ b/lib/amd/build/str.min.js
@@ -7,6 +7,6 @@ define("core/str",["exports","jquery","core/ajax","core/localstorage"],(function
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 2.9
*
- */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.get_strings=_exports.get_string=_exports.cache_strings=void 0,_jquery=_interopRequireDefault(_jquery),_ajax=_interopRequireDefault(_ajax),_localstorage=_interopRequireDefault(_localstorage);let promiseCache=[];_exports.get_string=(key,component,param,lang)=>get_strings([{key:key,component:component,param:param,lang:lang}]).then((results=>results[0]));const get_strings=requests=>{let requestData=[];const pageLang=(0,_jquery.default)("html").attr("lang").replace(/-/g,"_"),stringPromises=requests.map((request=>{const cacheKey=(_ref=>{let{key:key,component:component,lang:lang=pageLang}=_ref;return component||(component="core"),"core_str/".concat(key,"/").concat(component,"/").concat(lang)})(request),{component:component,key:key,param:param,lang:lang=pageLang}=request,buildReturn=promise=>(promiseCache[cacheKey]=promise,promise);if(component in M.str&&key in M.str[component])return buildReturn(new Promise((resolve=>{resolve(M.util.get_string(key,component,param,lang))})));const cached=_localstorage.default.get(cacheKey);return cached?(M.str[component]={...M.str[component],[key]:cached},buildReturn(new Promise((resolve=>{resolve(M.util.get_string(key,component,param,lang))})))):cacheKey in promiseCache?buildReturn(promiseCache[cacheKey]).then((()=>M.util.get_string(key,component,param,lang))):buildReturn(new Promise(((resolve,reject)=>{requestData.push({methodname:"core_get_string",args:{stringid:key,stringparams:[],component:component,lang:lang},done:str=>{M.str[component]={...M.str[component],[key]:str},_localstorage.default.set(cacheKey,str),resolve(M.util.get_string(key,component,param,lang))},fail:reject})})))}));return requestData.length&&_ajax.default.call(requestData,!0,!1,!1,0,M.cfg.langrev),_jquery.default.when.apply(_jquery.default,stringPromises).then((function(){for(var _len=arguments.length,strings=new Array(_len),_key=0;_key<_len;_key++)strings[_key]=arguments[_key];return strings}))};_exports.get_strings=get_strings;_exports.cache_strings=strings=>{const defaultLang=(0,_jquery.default)("html").attr("lang").replace(/-/g,"_");strings.forEach((_ref2=>{let{key:key,component:component,value:value,lang:lang=defaultLang}=_ref2;const cacheKey=["core_str",key,component,lang].join("/");component in M.str&&key in M.str[component]||(component in M.str||(M.str[component]={}),M.str[component][key]=value),_localstorage.default.get(cacheKey)||_localstorage.default.set(cacheKey,value),cacheKey in promiseCache||(promiseCache[cacheKey]=_jquery.default.Deferred().resolve(value).promise())}))}}));
+ */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.get_strings=_exports.get_string=_exports.cache_strings=void 0,_jquery=_interopRequireDefault(_jquery),_ajax=_interopRequireDefault(_ajax),_localstorage=_interopRequireDefault(_localstorage);let promiseCache=[];_exports.get_string=(key,component,param,lang)=>get_strings([{key:key,component:component,param:param,lang:lang}]).then((results=>results[0]));const get_strings=requests=>{let requestData=[];const pageLang=(0,_jquery.default)("html").attr("lang").replace(/-/g,"_"),stringPromises=requests.map((request=>{let{component:component,key:key,param:param,lang:lang=pageLang}=request;component||(component="core");const cacheKey=(_ref=>{let{key:key,component:component,lang:lang=pageLang}=_ref;return"core_str/".concat(key,"/").concat(component,"/").concat(lang)})({key:key,component:component,lang:lang}),buildReturn=promise=>(promiseCache[cacheKey]=promise,promise);if(component in M.str&&key in M.str[component])return buildReturn(new Promise((resolve=>{resolve(M.util.get_string(key,component,param,lang))})));const cached=_localstorage.default.get(cacheKey);return cached?(M.str[component]={...M.str[component],[key]:cached},buildReturn(new Promise((resolve=>{resolve(M.util.get_string(key,component,param,lang))})))):cacheKey in promiseCache?buildReturn(promiseCache[cacheKey]).then((()=>M.util.get_string(key,component,param,lang))):buildReturn(new Promise(((resolve,reject)=>{requestData.push({methodname:"core_get_string",args:{stringid:key,stringparams:[],component:component,lang:lang},done:str=>{M.str[component]={...M.str[component],[key]:str},_localstorage.default.set(cacheKey,str),resolve(M.util.get_string(key,component,param,lang))},fail:reject})})))}));return requestData.length&&_ajax.default.call(requestData,!0,!1,!1,0,M.cfg.langrev),_jquery.default.when.apply(_jquery.default,stringPromises).then((function(){for(var _len=arguments.length,strings=new Array(_len),_key=0;_key<_len;_key++)strings[_key]=arguments[_key];return strings}))};_exports.get_strings=get_strings;_exports.cache_strings=strings=>{const defaultLang=(0,_jquery.default)("html").attr("lang").replace(/-/g,"_");strings.forEach((_ref2=>{let{key:key,component:component,value:value,lang:lang=defaultLang}=_ref2;const cacheKey=["core_str",key,component,lang].join("/");component in M.str&&key in M.str[component]||(component in M.str||(M.str[component]={}),M.str[component][key]=value),_localstorage.default.get(cacheKey)||_localstorage.default.set(cacheKey,value),cacheKey in promiseCache||(promiseCache[cacheKey]=_jquery.default.Deferred().resolve(value).promise())}))}}));
//# sourceMappingURL=str.min.js.map
\ No newline at end of file
diff --git a/lib/amd/build/str.min.js.map b/lib/amd/build/str.min.js.map
index 3ba7e0efe03..d1fdc49e74e 100644
--- a/lib/amd/build/str.min.js.map
+++ b/lib/amd/build/str.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"str.min.js","sources":["../src/str.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Fetch and return language strings.\n *\n * @module core/str\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n *\n */\nimport $ from 'jquery';\nimport Ajax from 'core/ajax';\nimport LocalStorage from 'core/localstorage';\n\n// Module cache for the promises so that we don't make multiple\n// unnecessary requests.\nlet promiseCache = [];\n\n/* eslint-disable no-restricted-properties */\n\n/**\n * Return a Promise that resolves to a string.\n *\n * If the string has previously been cached, then the Promise will be resolved immediately, otherwise it will be fetched\n * from the server and resolved when available.\n *\n * @method get_string\n * @param {string} key The language string key\n * @param {string} component The language string component\n * @param {string} param The param for variable expansion in the string.\n * @param {string} lang The users language - if not passed it is deduced.\n * @return {Promise}\n *\n * @example Fetching a string\n *\n * import {get_string as getString} from 'core/str';\n * get_string('cannotfindteacher', 'error')\n * .then(str => {\n * window.console.log(str); // Cannot find teacher\n * })\n * .catch();\n */\n// eslint-disable-next-line camelcase\nexport const get_string = (key, component, param, lang) => {\n return get_strings([{key, component, param, lang}])\n .then(results => results[0]);\n};\n\n/**\n * Make a batch request to load a set of strings.\n *\n * Any missing string will be fetched from the server.\n * The Promise will only be resolved once all strings are available, or an attempt has been made to fetch them.\n *\n * @method get_strings\n * @param {Object[]} requests List of strings to fetch\n * @param {string} requests.key The string identifer to fetch\n * @param {string} [requests.component='core'] The componet to fetch from\n * @param {string} [requests.lang] The language to fetch a string for. Defaults to current page language.\n * @param {object|string} [requests.param] The param for variable expansion in the string.\n * @return {Promise[]}\n *\n * @example Fetching a set of strings\n *\n * import {get_strings as getStrings} from 'core/str';\n * get_strings([\n * {\n * key: 'cannotfindteacher',\n * component: 'error',\n * },\n * {\n * key: 'yes',\n * component: 'core',\n * },\n * {\n * key: 'no',\n * component: 'core',\n * },\n * ])\n * .then((cannotFindTeacher, yes, no) => {\n * window.console.log(cannotFindTeacher); // Cannot find teacher\n * window.console.log(yes); // Yes\n * window.console.log(no); // No\n * })\n * .catch();\n */\n// eslint-disable-next-line camelcase\nexport const get_strings = (requests) => {\n let requestData = [];\n const pageLang = $('html').attr('lang').replace(/-/g, '_');\n // Helper function to construct the cache key.\n const getCacheKey = ({key, component, lang = pageLang}) => {\n if (!component) {\n component = 'core';\n }\n return `core_str/${key}/${component}/${lang}`;\n };\n\n const stringPromises = requests.map((request) => {\n const cacheKey = getCacheKey(request);\n const {component, key, param, lang = pageLang} = request;\n // Helper function to add the promise to cache.\n const buildReturn = (promise) => {\n // Make sure the promise cache contains our promise.\n promiseCache[cacheKey] = promise;\n return promise;\n };\n\n // Check if we can serve the string straight from M.str.\n if (component in M.str && key in M.str[component]) {\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if the string is in the browser's local storage.\n const cached = LocalStorage.get(cacheKey);\n if (cached) {\n M.str[component] = {...M.str[component], [key]: cached};\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if we've already loaded this string from the server.\n if (cacheKey in promiseCache) {\n return buildReturn(promiseCache[cacheKey]).then(() => {\n return M.util.get_string(key, component, param, lang);\n });\n } else {\n // We're going to have to ask the server for the string so\n // add this string to the list of requests to be sent.\n return buildReturn(new Promise((resolve, reject) => {\n requestData.push({\n methodname: 'core_get_string',\n args: {\n stringid: key,\n stringparams: [],\n component,\n lang,\n },\n done: (str) => {\n // When we get the response from the server\n // we should update M.str and the browser's\n // local storage before resolving this promise.\n M.str[component] = {...M.str[component], [key]: str};\n LocalStorage.set(cacheKey, str);\n resolve(M.util.get_string(key, component, param, lang));\n },\n fail: reject\n });\n }));\n }\n });\n\n if (requestData.length) {\n // If we need to load any strings from the server then send\n // off the request.\n Ajax.call(requestData, true, false, false, 0, M.cfg.langrev);\n }\n\n // We need to use jQuery here because some calling code uses the\n // .done handler instead of the .then handler.\n return $.when.apply($, stringPromises)\n .then((...strings) => strings);\n};\n\n/**\n * Add a list of strings to the caches.\n *\n * This function should typically only be called from core APIs to pre-cache values.\n *\n * @method cache_strings\n * @protected\n * @param {Object[]} strings List of strings to fetch\n * @param {string} strings.key The string identifer to fetch\n * @param {string} strings.value The string value\n * @param {string} [strings.component='core'] The componet to fetch from\n * @param {string} [strings.lang] The language to fetch a string for. Defaults to current page language.\n */\n// eslint-disable-next-line camelcase\nexport const cache_strings = (strings) => {\n const defaultLang = $('html').attr('lang').replace(/-/g, '_');\n\n strings.forEach(({key, component, value, lang = defaultLang}) => {\n const cacheKey = ['core_str', key, component, lang].join('/');\n\n // Check M.str caching.\n if (!(component in M.str) || !(key in M.str[component])) {\n if (!(component in M.str)) {\n M.str[component] = {};\n }\n\n M.str[component][key] = value;\n }\n\n // Check local storage.\n if (!LocalStorage.get(cacheKey)) {\n LocalStorage.set(cacheKey, value);\n }\n\n // Check the promises cache.\n if (!(cacheKey in promiseCache)) {\n promiseCache[cacheKey] = $.Deferred().resolve(value).promise();\n }\n });\n};\n/* eslint-enable no-restricted-properties */\n"],"names":["promiseCache","key","component","param","lang","get_strings","then","results","requests","requestData","pageLang","attr","replace","stringPromises","map","request","cacheKey","_ref","getCacheKey","buildReturn","promise","M","str","Promise","resolve","util","get_string","cached","LocalStorage","get","reject","push","methodname","args","stringid","stringparams","done","set","fail","length","call","cfg","langrev","$","when","apply","strings","defaultLang","forEach","_ref2","value","join","Deferred"],"mappings":";;;;;;;;;wQA8BIA,aAAe,uBA2BO,CAACC,IAAKC,UAAWC,MAAOC,OACvCC,YAAY,CAAC,CAACJ,IAAAA,IAAKC,UAAAA,UAAWC,MAAAA,MAAOC,KAAAA,QACvCE,MAAKC,SAAWA,QAAQ,WA0CpBF,YAAeG,eACpBC,YAAc,SACZC,UAAW,mBAAE,QAAQC,KAAK,QAAQC,QAAQ,KAAM,KAShDC,eAAiBL,SAASM,KAAKC,gBAC3BC,SARUC,CAAAA,WAAChB,IAACA,IAADC,UAAMA,UAANE,KAAiBA,KAAOM,sBACpCR,YACDA,UAAY,2BAEGD,gBAAOC,sBAAaE,OAItBc,CAAYH,UACvBb,UAACA,UAADD,IAAYA,IAAZE,MAAiBA,MAAjBC,KAAwBA,KAAOM,UAAYK,QAE3CI,YAAeC,UAEjBpB,aAAagB,UAAYI,QAClBA,YAIPlB,aAAamB,EAAEC,KAAOrB,OAAOoB,EAAEC,IAAIpB,kBAC5BiB,YAAY,IAAII,SAASC,UAC5BA,QAAQH,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,iBAKnDuB,OAASC,sBAAaC,IAAIb,iBAC5BW,QACAN,EAAEC,IAAIpB,WAAa,IAAImB,EAAEC,IAAIpB,YAAaD,KAAM0B,QACzCR,YAAY,IAAII,SAASC,UAC5BA,QAAQH,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,YAKrDY,YAAYhB,aACLmB,YAAYnB,aAAagB,WAAWV,MAAK,IACrCe,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,QAK7Ce,YAAY,IAAII,SAAQ,CAACC,QAASM,UACrCrB,YAAYsB,KAAK,CACbC,WAAY,kBACZC,KAAM,CACFC,SAAUjC,IACVkC,aAAc,GACdjC,UAAAA,UACAE,KAAAA,MAEJgC,KAAOd,MAIHD,EAAEC,IAAIpB,WAAa,IAAImB,EAAEC,IAAIpB,YAAaD,KAAMqB,2BACnCe,IAAIrB,SAAUM,KAC3BE,QAAQH,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,QAErDkC,KAAMR,uBAMlBrB,YAAY8B,sBAGPC,KAAK/B,aAAa,GAAM,GAAO,EAAO,EAAGY,EAAEoB,IAAIC,SAKjDC,gBAAEC,KAAKC,MAAMF,gBAAG9B,gBAClBP,MAAK,yCAAIwC,gDAAAA,qCAAYA,oEAiBAA,gBACpBC,aAAc,mBAAE,QAAQpC,KAAK,QAAQC,QAAQ,KAAM,KAEzDkC,QAAQE,SAAQC,YAAChD,IAACA,IAADC,UAAMA,UAANgD,MAAiBA,MAAjB9C,KAAwBA,KAAO2C,yBACtC/B,SAAW,CAAC,WAAYf,IAAKC,UAAWE,MAAM+C,KAAK,KAGnDjD,aAAamB,EAAEC,KAAUrB,OAAOoB,EAAEC,IAAIpB,aAClCA,aAAamB,EAAEC,MACjBD,EAAEC,IAAIpB,WAAa,IAGvBmB,EAAEC,IAAIpB,WAAWD,KAAOiD,OAIvBtB,sBAAaC,IAAIb,iCACLqB,IAAIrB,SAAUkC,OAIzBlC,YAAYhB,eACdA,aAAagB,UAAY2B,gBAAES,WAAW5B,QAAQ0B,OAAO9B"}
\ No newline at end of file
+{"version":3,"file":"str.min.js","sources":["../src/str.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Fetch and return language strings.\n *\n * @module core/str\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n *\n */\nimport $ from 'jquery';\nimport Ajax from 'core/ajax';\nimport LocalStorage from 'core/localstorage';\n\n// Module cache for the promises so that we don't make multiple\n// unnecessary requests.\nlet promiseCache = [];\n\n/* eslint-disable no-restricted-properties */\n\n/**\n * Return a Promise that resolves to a string.\n *\n * If the string has previously been cached, then the Promise will be resolved immediately, otherwise it will be fetched\n * from the server and resolved when available.\n *\n * @method get_string\n * @param {string} key The language string key\n * @param {string} component The language string component\n * @param {string} param The param for variable expansion in the string.\n * @param {string} lang The users language - if not passed it is deduced.\n * @return {Promise}\n *\n * @example Fetching a string\n *\n * import {get_string as getString} from 'core/str';\n * get_string('cannotfindteacher', 'error')\n * .then(str => {\n * window.console.log(str); // Cannot find teacher\n * })\n * .catch();\n */\n// eslint-disable-next-line camelcase\nexport const get_string = (key, component, param, lang) => {\n return get_strings([{key, component, param, lang}])\n .then(results => results[0]);\n};\n\n/**\n * Make a batch request to load a set of strings.\n *\n * Any missing string will be fetched from the server.\n * The Promise will only be resolved once all strings are available, or an attempt has been made to fetch them.\n *\n * @method get_strings\n * @param {Object[]} requests List of strings to fetch\n * @param {string} requests.key The string identifer to fetch\n * @param {string} [requests.component='core'] The componet to fetch from\n * @param {string} [requests.lang] The language to fetch a string for. Defaults to current page language.\n * @param {object|string} [requests.param] The param for variable expansion in the string.\n * @return {Promise[]}\n *\n * @example Fetching a set of strings\n *\n * import {get_strings as getStrings} from 'core/str';\n * get_strings([\n * {\n * key: 'cannotfindteacher',\n * component: 'error',\n * },\n * {\n * key: 'yes',\n * component: 'core',\n * },\n * {\n * key: 'no',\n * component: 'core',\n * },\n * ])\n * .then((cannotFindTeacher, yes, no) => {\n * window.console.log(cannotFindTeacher); // Cannot find teacher\n * window.console.log(yes); // Yes\n * window.console.log(no); // No\n * })\n * .catch();\n */\n// eslint-disable-next-line camelcase\nexport const get_strings = (requests) => {\n let requestData = [];\n const pageLang = $('html').attr('lang').replace(/-/g, '_');\n\n // Helper function to construct the cache key.\n const getCacheKey = ({key, component, lang = pageLang}) => `core_str/${key}/${component}/${lang}`;\n\n const stringPromises = requests.map((request) => {\n let {component, key, param, lang = pageLang} = request;\n if (!component) {\n component = 'core';\n }\n\n const cacheKey = getCacheKey({key, component, lang});\n\n // Helper function to add the promise to cache.\n const buildReturn = (promise) => {\n // Make sure the promise cache contains our promise.\n promiseCache[cacheKey] = promise;\n return promise;\n };\n\n // Check if we can serve the string straight from M.str.\n if (component in M.str && key in M.str[component]) {\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if the string is in the browser's local storage.\n const cached = LocalStorage.get(cacheKey);\n if (cached) {\n M.str[component] = {...M.str[component], [key]: cached};\n return buildReturn(new Promise((resolve) => {\n resolve(M.util.get_string(key, component, param, lang));\n }));\n }\n\n // Check if we've already loaded this string from the server.\n if (cacheKey in promiseCache) {\n return buildReturn(promiseCache[cacheKey]).then(() => {\n return M.util.get_string(key, component, param, lang);\n });\n } else {\n // We're going to have to ask the server for the string so\n // add this string to the list of requests to be sent.\n return buildReturn(new Promise((resolve, reject) => {\n requestData.push({\n methodname: 'core_get_string',\n args: {\n stringid: key,\n stringparams: [],\n component,\n lang,\n },\n done: (str) => {\n // When we get the response from the server\n // we should update M.str and the browser's\n // local storage before resolving this promise.\n M.str[component] = {...M.str[component], [key]: str};\n LocalStorage.set(cacheKey, str);\n resolve(M.util.get_string(key, component, param, lang));\n },\n fail: reject\n });\n }));\n }\n });\n\n if (requestData.length) {\n // If we need to load any strings from the server then send\n // off the request.\n Ajax.call(requestData, true, false, false, 0, M.cfg.langrev);\n }\n\n // We need to use jQuery here because some calling code uses the\n // .done handler instead of the .then handler.\n return $.when.apply($, stringPromises)\n .then((...strings) => strings);\n};\n\n/**\n * Add a list of strings to the caches.\n *\n * This function should typically only be called from core APIs to pre-cache values.\n *\n * @method cache_strings\n * @protected\n * @param {Object[]} strings List of strings to fetch\n * @param {string} strings.key The string identifer to fetch\n * @param {string} strings.value The string value\n * @param {string} [strings.component='core'] The componet to fetch from\n * @param {string} [strings.lang] The language to fetch a string for. Defaults to current page language.\n */\n// eslint-disable-next-line camelcase\nexport const cache_strings = (strings) => {\n const defaultLang = $('html').attr('lang').replace(/-/g, '_');\n\n strings.forEach(({key, component, value, lang = defaultLang}) => {\n const cacheKey = ['core_str', key, component, lang].join('/');\n\n // Check M.str caching.\n if (!(component in M.str) || !(key in M.str[component])) {\n if (!(component in M.str)) {\n M.str[component] = {};\n }\n\n M.str[component][key] = value;\n }\n\n // Check local storage.\n if (!LocalStorage.get(cacheKey)) {\n LocalStorage.set(cacheKey, value);\n }\n\n // Check the promises cache.\n if (!(cacheKey in promiseCache)) {\n promiseCache[cacheKey] = $.Deferred().resolve(value).promise();\n }\n });\n};\n/* eslint-enable no-restricted-properties */\n"],"names":["promiseCache","key","component","param","lang","get_strings","then","results","requests","requestData","pageLang","attr","replace","stringPromises","map","request","cacheKey","_ref","getCacheKey","buildReturn","promise","M","str","Promise","resolve","util","get_string","cached","LocalStorage","get","reject","push","methodname","args","stringid","stringparams","done","set","fail","length","call","cfg","langrev","$","when","apply","strings","defaultLang","forEach","_ref2","value","join","Deferred"],"mappings":";;;;;;;;;wQA8BIA,aAAe,uBA2BO,CAACC,IAAKC,UAAWC,MAAOC,OACvCC,YAAY,CAAC,CAACJ,IAAAA,IAAKC,UAAAA,UAAWC,MAAAA,MAAOC,KAAAA,QACvCE,MAAKC,SAAWA,QAAQ,WA0CpBF,YAAeG,eACpBC,YAAc,SACZC,UAAW,mBAAE,QAAQC,KAAK,QAAQC,QAAQ,KAAM,KAKhDC,eAAiBL,SAASM,KAAKC,cAC7Bb,UAACA,UAADD,IAAYA,IAAZE,MAAiBA,MAAjBC,KAAwBA,KAAOM,UAAYK,QAC1Cb,YACDA,UAAY,cAGVc,SARUC,CAAAA,WAAChB,IAACA,IAADC,UAAMA,UAANE,KAAiBA,KAAOM,wCAA0BT,gBAAOC,sBAAaE,OAQtEc,CAAY,CAACjB,IAAAA,IAAKC,UAAAA,UAAWE,KAAAA,OAGxCe,YAAeC,UAEjBpB,aAAagB,UAAYI,QAClBA,YAIPlB,aAAamB,EAAEC,KAAOrB,OAAOoB,EAAEC,IAAIpB,kBAC5BiB,YAAY,IAAII,SAASC,UAC5BA,QAAQH,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,iBAKnDuB,OAASC,sBAAaC,IAAIb,iBAC5BW,QACAN,EAAEC,IAAIpB,WAAa,IAAImB,EAAEC,IAAIpB,YAAaD,KAAM0B,QACzCR,YAAY,IAAII,SAASC,UAC5BA,QAAQH,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,YAKrDY,YAAYhB,aACLmB,YAAYnB,aAAagB,WAAWV,MAAK,IACrCe,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,QAK7Ce,YAAY,IAAII,SAAQ,CAACC,QAASM,UACrCrB,YAAYsB,KAAK,CACbC,WAAY,kBACZC,KAAM,CACFC,SAAUjC,IACVkC,aAAc,GACdjC,UAAAA,UACAE,KAAAA,MAEJgC,KAAOd,MAIHD,EAAEC,IAAIpB,WAAa,IAAImB,EAAEC,IAAIpB,YAAaD,KAAMqB,2BACnCe,IAAIrB,SAAUM,KAC3BE,QAAQH,EAAEI,KAAKC,WAAWzB,IAAKC,UAAWC,MAAOC,QAErDkC,KAAMR,uBAMlBrB,YAAY8B,sBAGPC,KAAK/B,aAAa,GAAM,GAAO,EAAO,EAAGY,EAAEoB,IAAIC,SAKjDC,gBAAEC,KAAKC,MAAMF,gBAAG9B,gBAClBP,MAAK,yCAAIwC,gDAAAA,qCAAYA,oEAiBAA,gBACpBC,aAAc,mBAAE,QAAQpC,KAAK,QAAQC,QAAQ,KAAM,KAEzDkC,QAAQE,SAAQC,YAAChD,IAACA,IAADC,UAAMA,UAANgD,MAAiBA,MAAjB9C,KAAwBA,KAAO2C,yBACtC/B,SAAW,CAAC,WAAYf,IAAKC,UAAWE,MAAM+C,KAAK,KAGnDjD,aAAamB,EAAEC,KAAUrB,OAAOoB,EAAEC,IAAIpB,aAClCA,aAAamB,EAAEC,MACjBD,EAAEC,IAAIpB,WAAa,IAGvBmB,EAAEC,IAAIpB,WAAWD,KAAOiD,OAIvBtB,sBAAaC,IAAIb,iCACLqB,IAAIrB,SAAUkC,OAIzBlC,YAAYhB,eACdA,aAAagB,UAAY2B,gBAAES,WAAW5B,QAAQ0B,OAAO9B"}
\ No newline at end of file
diff --git a/lib/amd/src/str.js b/lib/amd/src/str.js
index ea75611d899..9a933320511 100644
--- a/lib/amd/src/str.js
+++ b/lib/amd/src/str.js
@@ -102,17 +102,18 @@ export const get_string = (key, component, param, lang) => {
export const get_strings = (requests) => {
let requestData = [];
const pageLang = $('html').attr('lang').replace(/-/g, '_');
+
// Helper function to construct the cache key.
- const getCacheKey = ({key, component, lang = pageLang}) => {
+ const getCacheKey = ({key, component, lang = pageLang}) => `core_str/${key}/${component}/${lang}`;
+
+ const stringPromises = requests.map((request) => {
+ let {component, key, param, lang = pageLang} = request;
if (!component) {
component = 'core';
}
- return `core_str/${key}/${component}/${lang}`;
- };
- const stringPromises = requests.map((request) => {
- const cacheKey = getCacheKey(request);
- const {component, key, param, lang = pageLang} = request;
+ const cacheKey = getCacheKey({key, component, lang});
+
// Helper function to add the promise to cache.
const buildReturn = (promise) => {
// Make sure the promise cache contains our promise.