Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
11 efrain 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 <http://www.gnu.org/licenses/>.\n\n/**\n * Fetch and return language strings.\n *\n * @module     core/str\n * @copyright  2015 Damyon Wiese <damyon@moodle.com>\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 Config from 'core/config';\nimport LocalStorage from 'core/localstorage';\n\n/**\n * @typedef StringRequest\n * @type {object}\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 */\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 * @param {string} key The language string key\n * @param {string} [component='core'] The language string component\n * @param {object|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 {jQuery.Promise} A jQuery Promise containing the translated string\n *\n * @example <caption>Fetching a string</caption>\n *\n * import {getString} from 'core/str';\n * get_string('cannotfindteacher', 'error')\n * .then((str) => window.console.log(str)); // Cannot find teacher\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 * 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 * @param {string} key The language string key\n * @param {string} [component='core'] The language string component\n * @param {object|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<string>} A native Promise containing the translated string\n *\n * @example <caption>Fetching a string</caption>\n *\n * import {getString} from 'core/str';\n *\n * getString('cannotfindteacher', 'error')\n * .then((str) => window.console.log(str)); // Cannot find teacher\n */\nexport const getString = (key, component, param, lang) =>\n    getRequestedStrings([{key, component, param, lang}])[0];\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 * @param {Array.<StringRequest>} requests List of strings to fetch\n * @return {Promise<string[]>} A native promise containing an array of the translated strings\n *\n * @example <caption>Fetching a set of strings</caption>\n *\n * import {getStrings} from 'core/str';\n * getStrings([\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 */\nexport const getStrings = (requests) => Promise.all(getRequestedStrings(requests));\n\n/**\n * Internal function to perform the string requests.\n *\n * @param {Array.<StringRequest>} requests List of strings to fetch\n * @returns {Promise[]}\n */\nconst getRequestedStrings = (requests) => {\n    let requestData = [];\n    const pageLang = Config.language;\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));\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));\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);\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));\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    return stringPromises;\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 * @param {Array.<StringRequest>} requests List of strings to fetch\n * @return {jquery.Promise<string[]>} A jquery promise containing an array of the translated strings\n *\n * @example <caption>Fetching a set of strings</caption>\n *\n * import {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 */\n// eslint-disable-next-line camelcase\nexport const get_strings = (requests) => {\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($, getRequestedStrings(requests))\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=Config.language] 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    strings.forEach(({key, component, value, lang = Config.language}) => {\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","getRequestedStrings","requests","Promise","all","requestData","pageLang","Config","language","stringPromises","map","request","cacheKey","_ref","getCacheKey","buildReturn","promise","M","str","resolve","util","get_string","cached","LocalStorage","get","reject","push","methodname","args","stringid","stringparams","done","set","fail","length","call","cfg","langrev","$","when","apply","strings","forEach","_ref2","value","join","Deferred"],"mappings":";;;;;;;;;uVAwCIA,aAAe,uBAuBO,CAACC,IAAKC,UAAWC,MAAOC,OACvCC,YAAY,CAAC,CAACJ,IAAAA,IAAKC,UAAAA,UAAWC,MAAAA,MAAOC,KAAAA,QACvCE,MAAKC,SAAWA,QAAQ,wBAsBR,CAACN,IAAKC,UAAWC,MAAOC,OAC7CI,oBAAoB,CAAC,CAACP,IAAAA,IAAKC,UAAAA,UAAWC,MAAAA,MAAOC,KAAAA,QAAQ,uBAkC9BK,UAAaC,QAAQC,IAAIH,oBAAoBC,iBAQlED,oBAAuBC,eACrBG,YAAc,SACZC,SAAWC,gBAAOC,SAKlBC,eAAiBP,SAASQ,KAAKC,cAC7BhB,UAACA,UAADD,IAAYA,IAAZE,MAAiBA,MAAjBC,KAAwBA,KAAOS,UAAYK,QAC1ChB,YACDA,UAAY,cAGViB,SARUC,CAAAA,WAACnB,IAACA,IAADC,UAAMA,UAANE,KAAiBA,KAAOS,wCAA0BZ,gBAAOC,sBAAaE,OAQtEiB,CAAY,CAACpB,IAAAA,IAAKC,UAAAA,UAAWE,KAAAA,OAGxCkB,YAAeC,UAEjBvB,aAAamB,UAAYI,QAClBA,YAIPrB,aAAasB,EAAEC,KAAOxB,OAAOuB,EAAEC,IAAIvB,kBAC5BoB,YAAY,IAAIZ,SAASgB,UAC5BA,QAAQF,EAAEG,KAAKC,WAAW3B,IAAKC,UAAWC,kBAK5C0B,OAASC,sBAAaC,IAAIZ,iBAC5BU,QACAL,EAAEC,IAAIvB,WAAa,IAAIsB,EAAEC,IAAIvB,YAAaD,KAAM4B,QACzCP,YAAY,IAAIZ,SAASgB,UAC5BA,QAAQF,EAAEG,KAAKC,WAAW3B,IAAKC,UAAWC,aAK9CgB,YAAYnB,aACLsB,YAAYtB,aAAamB,WAAWb,MAAK,IACrCkB,EAAEG,KAAKC,WAAW3B,IAAKC,UAAWC,SAKtCmB,YAAY,IAAIZ,SAAQ,CAACgB,QAASM,UACrCpB,YAAYqB,KAAK,CACbC,WAAY,kBACZC,KAAM,CACFC,SAAUnC,IACVoC,aAAc,GACdnC,UAAAA,UACAE,KAAAA,MAEJkC,KAAOb,MAIHD,EAAEC,IAAIvB,WAAa,IAAIsB,EAAEC,IAAIvB,YAAaD,KAAMwB,2BACnCc,IAAIpB,SAAUM,KAC3BC,QAAQF,EAAEG,KAAKC,WAAW3B,IAAKC,UAAWC,SAE9CqC,KAAMR,uBAMlBpB,YAAY6B,sBAGPC,KAAK9B,aAAa,GAAM,GAAO,EAAO,EAAGY,EAAEmB,IAAIC,SAGjD5B,gBAoCEX,YAAeI,UAGjBoC,gBAAEC,KAAKC,MAAMF,gBAAGrC,oBAAoBC,WACtCH,MAAK,yCAAI0C,gDAAAA,qCAAYA,mEAiBAA,UAC1BA,QAAQC,SAAQC,YAACjD,IAACA,IAADC,UAAMA,UAANiD,MAAiBA,MAAjB/C,KAAwBA,KAAOU,gBAAOC,sBAC7CI,SAAW,CAAC,WAAYlB,IAAKC,UAAWE,MAAMgD,KAAK,KAGnDlD,aAAasB,EAAEC,KAAUxB,OAAOuB,EAAEC,IAAIvB,aAClCA,aAAasB,EAAEC,MACjBD,EAAEC,IAAIvB,WAAa,IAGvBsB,EAAEC,IAAIvB,WAAWD,KAAOkD,OAIvBrB,sBAAaC,IAAIZ,iCACLoB,IAAIpB,SAAUgC,OAIzBhC,YAAYnB,eACdA,aAAamB,UAAY0B,gBAAEQ,WAAW3B,QAAQyB,OAAO5B"}