MDL-64348 javascript: add cache_strings to str.js

Added a function to allow a set of strings to be added to the
str.js caches if they've been loaded outside of that module.
This commit is contained in:
Ryan Wyllie 2018-12-11 11:08:33 +08:00
parent e0034b5da6
commit fbbed5c603
2 changed files with 37 additions and 1 deletions

View File

@ -1 +1 @@
define(["jquery","core/ajax","core/localstorage"],function(a,b,c){var d=[];return{get_string:function(a,b,c,d){var e=this.get_strings([{key:a,component:b,param:c,lang:d}]);return e.then(function(a){return a[0]})},get_strings:function(e){var f,g=a.Deferred(),h=[],i=0,j=!1;for(i=0;i<e.length;i++)if(f=e[i],"undefined"==typeof f.lang&&(f.lang=a("html").attr("lang").replace(/-/g,"_")),f.cacheKey="core_str/"+f.key+"/"+f.component+"/"+f.lang,"undefined"==typeof M.str[f.component]||"undefined"==typeof M.str[f.component][f.key]){var k=c.get(f.cacheKey);k?("undefined"==typeof M.str[f.component]&&(M.str[f.component]=[]),M.str[f.component][f.key]=k):j=!0}if(j){var l=[],m=[],n=function(a){this.resolve(a)},o=function(a){this.reject(a)};for(i=0;i<e.length;i++)if(f=e[i],"undefined"!=typeof d[f.cacheKey])m.push(d[f.cacheKey]);else{var p=a.Deferred();l.push({methodname:"core_get_string",args:{stringid:f.key,component:f.component,lang:f.lang,stringparams:[]},done:n.bind(p),fail:o.bind(p)}),d[f.cacheKey]=p.promise(),m.push(d[f.cacheKey])}l.length>0&&b.call(l,!0,!1),a.when.apply(null,m).done(function(){var a=0;for(a=0;a<arguments.length;a++)f=e[a],"undefined"==typeof M.str[f.component]&&(M.str[f.component]=[]),M.str[f.component][f.key]=arguments[a],c.set("core_str/"+f.key+"/"+f.component+"/"+f.lang,arguments[a]),h[a]=M.util.get_string(f.key,f.component,f.param).trim();g.resolve(h)}).fail(function(a){g.reject(a)})}else{for(i=0;i<e.length;i++)f=e[i],h[i]=M.util.get_string(f.key,f.component,f.param);g.resolve(h)}return g.promise()}}});
define(["jquery","core/ajax","core/localstorage"],function(a,b,c){var d=[];return{get_string:function(a,b,c,d){var e=this.get_strings([{key:a,component:b,param:c,lang:d}]);return e.then(function(a){return a[0]})},get_strings:function(e){var f,g=a.Deferred(),h=[],i=0,j=!1;for(i=0;i<e.length;i++)if(f=e[i],"undefined"==typeof f.lang&&(f.lang=a("html").attr("lang").replace(/-/g,"_")),f.cacheKey="core_str/"+f.key+"/"+f.component+"/"+f.lang,"undefined"==typeof M.str[f.component]||"undefined"==typeof M.str[f.component][f.key]){var k=c.get(f.cacheKey);k?("undefined"==typeof M.str[f.component]&&(M.str[f.component]=[]),M.str[f.component][f.key]=k):j=!0}if(j){var l=[],m=[],n=function(a){this.resolve(a)},o=function(a){this.reject(a)};for(i=0;i<e.length;i++)if(f=e[i],"undefined"!=typeof d[f.cacheKey])m.push(d[f.cacheKey]);else{var p=a.Deferred();l.push({methodname:"core_get_string",args:{stringid:f.key,component:f.component,lang:f.lang,stringparams:[]},done:n.bind(p),fail:o.bind(p)}),d[f.cacheKey]=p.promise(),m.push(d[f.cacheKey])}l.length>0&&b.call(l,!0,!1),a.when.apply(null,m).done(function(){var a=0;for(a=0;a<arguments.length;a++)f=e[a],"undefined"==typeof M.str[f.component]&&(M.str[f.component]=[]),M.str[f.component][f.key]=arguments[a],c.set("core_str/"+f.key+"/"+f.component+"/"+f.lang,arguments[a]),h[a]=M.util.get_string(f.key,f.component,f.param).trim();g.resolve(h)}).fail(function(a){g.reject(a)})}else{for(i=0;i<e.length;i++)f=e[i],h[i]=M.util.get_string(f.key,f.component,f.param);g.resolve(h)}return g.promise()},cache_strings:function(b){var e=a("html").attr("lang").replace(/-/g,"_");b.forEach(function(b){var f=f in b?b.lang:e,g=b.key,h=b.component,i=b.value,j=["core_str",g,h,f].join("/");h in M.str&&g in M.str[h]||(h in M.str||(M.str[h]={}),M.str[h][g]=i),c.get(j)||c.set(j,i),j in d||(d[j]=a.Deferred().resolve(i).promise())})}}});

View File

@ -176,6 +176,42 @@ define(['jquery', 'core/ajax', 'core/localstorage'], function($, ajax, storage)
}
return deferred.promise();
},
/**
* Add a list of strings to the caches.
*
* @method cache_strings
* @param {Object[]} strings Array of { key: key, component: component, lang: lang, value: value }
*/
// eslint-disable-next-line camelcase
cache_strings: function(strings) {
var defaultLang = $('html').attr('lang').replace(/-/g, '_');
strings.forEach(function(string) {
var lang = !(lang in string) ? defaultLang : string.lang;
var key = string.key;
var component = string.component;
var value = string.value;
var cacheKey = ['core_str', key, component, lang].join('/');
// Check M.str caching.
if (!(component in M.str) || !(key in M.str[component])) {
if (!(component in M.str)) {
M.str[component] = {};
}
M.str[component][key] = value;
}
// Check local storage.
if (!storage.get(cacheKey)) {
storage.set(cacheKey, value);
}
// Check the promises cache.
if (!(cacheKey in promiseCache)) {
promiseCache[cacheKey] = $.Deferred().resolve(value).promise();
}
});
}
};
});