/
intuition-mw.js
110 lines (94 loc) · 2.46 KB
/
intuition-mw.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*global mw */
(function ($) {
var intuition, userlang, queueTimeout, queueDeferred,
apiPath = 'api.php',
queueList = [],
requested = {},
hasOwn = requested.hasOwnProperty,
push = queueList.push,
slice = queueList.slice,
mwMsgPrefix = 'intuition-';
function handleQueue() {
var list = queueList.splice(0, queueList.length),
deferred = queueDeferred;
queueDeferred = queueTimeout = undefined;
$.ajax({
url: apiPath,
data: {
domains: list.join('|'),
userlang: userlang
},
dataType: $.support.cors ? 'json' : 'jsonp'
}).fail(deferred.reject).done(function (data) {
if (!data || !data.messages) {
return deferred.reject();
}
$.each(data.messages, intuition.put);
deferred.resolve();
});
}
intuition = {
/**
* @param {string|Array} domains
* @param {string} [lang=wgUserLanguage] Only one language is supported. Last one wins.
* @return {jQuery.Promise}
*/
load: function (domains, lang) {
var i,
list = [];
domains = typeof domains === 'string' ? [domains] : domains;
for (i = 0; i < domains.length; i++) {
if (!hasOwn.call(requested, domains[i])) {
requested[domains[i]] = true;
list.push(domains[i]);
}
}
if (!list.length) {
return $.Deferred().resolve();
}
// Defer request so we can perform them in batches
userlang = lang || mw.config.get('wgUserLanguage', 'en');
push.apply(queueList, list);
if (!queueDeferred) {
queueDeferred = $.Deferred();
}
if (queueTimeout) {
clearTimeout(queueTimeout);
}
queueTimeout = setTimeout(handleQueue, 100);
return queueDeferred.promise();
},
put: function (domain, msgs) {
requested[domain] = true;
if (msgs) {
$.each(msgs, function (key, val) {
mw.messages.set(mwMsgPrefix + domain + '-' + key, val);
});
}
},
/**
* @param {string} domain
* @param {string} key
* @param {Mixed...} [parameters]
* @return {string}
*/
msg: function (domain, key) {
var args = slice.call(arguments, 2);
args.unshift(mwMsgPrefix + domain + '-' + key);
return mw.message.apply(mw.message, args).toString();
},
/**
* @param {string} domain
* @param {string} key
* @param {Mixed...} [parameters]
* @return {mw.Message}
*/
message: function (domain, key) {
var args = slice.call(arguments, 2);
args.unshift(mwMsgPrefix + domain + '-' + key);
return mw.message.apply(mw.message, args);
}
};
// Expose
mw.libs.intuition = intuition;
}(jQuery));