@tolgee/core 5.8.0 → 5.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tolgee.cjs.js +650 -716
- package/dist/tolgee.cjs.js.map +1 -1
- package/dist/tolgee.cjs.min.js +1 -1
- package/dist/tolgee.cjs.min.js.map +1 -1
- package/dist/tolgee.esm.js +650 -716
- package/dist/tolgee.esm.js.map +1 -1
- package/dist/tolgee.esm.min.js +1 -1
- package/dist/tolgee.esm.min.js.map +1 -1
- package/dist/tolgee.esm.min.mjs +1 -1
- package/dist/tolgee.esm.min.mjs.map +1 -1
- package/dist/tolgee.esm.mjs +650 -716
- package/dist/tolgee.esm.mjs.map +1 -1
- package/dist/tolgee.umd.js +650 -716
- package/dist/tolgee.umd.js.map +1 -1
- package/dist/tolgee.umd.min.js +1 -1
- package/dist/tolgee.umd.min.js.map +1 -1
- package/lib/Controller/Cache/Cache.d.ts +14 -14
- package/lib/Controller/Controller.d.ts +23 -23
- package/lib/Controller/Events/EventEmitter.d.ts +1 -1
- package/lib/Controller/Events/EventEmitterSelective.d.ts +1 -1
- package/lib/Controller/Events/Events.d.ts +2 -2
- package/lib/Controller/Plugins/Plugins.d.ts +17 -17
- package/lib/Controller/State/State.d.ts +20 -20
- package/lib/Controller/State/initState.d.ts +1 -1
- package/lib/TolgeeCore.d.ts +2 -2
- package/lib/helpers.d.ts +2 -2
- package/package.json +2 -2
- package/src/Controller/Cache/Cache.ts +175 -193
- package/src/Controller/Controller.ts +105 -114
- package/src/Controller/Events/EventEmitter.ts +21 -22
- package/src/Controller/Events/EventEmitterSelective.ts +59 -58
- package/src/Controller/Events/Events.ts +41 -52
- package/src/Controller/Plugins/Plugins.ts +206 -219
- package/src/Controller/State/State.ts +135 -152
- package/src/Controller/State/initState.ts +3 -3
- package/src/Controller/ValueObserver.ts +11 -12
- package/src/TolgeeCore.ts +7 -7
- package/src/__test/cache.test.ts +3 -2
- package/src/helpers.ts +6 -5
package/dist/tolgee.umd.js
CHANGED
|
@@ -7,15 +7,17 @@
|
|
|
7
7
|
function isPromise(value) {
|
|
8
8
|
return Boolean(value && typeof value.then === 'function');
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
function valueOrPromise(value, callback) {
|
|
11
11
|
if (isPromise(value)) {
|
|
12
12
|
return Promise.resolve(value).then(callback);
|
|
13
13
|
}
|
|
14
14
|
else {
|
|
15
15
|
return callback(value);
|
|
16
16
|
}
|
|
17
|
-
}
|
|
18
|
-
|
|
17
|
+
}
|
|
18
|
+
function missingOptionError(option) {
|
|
19
|
+
return `Tolgee: You need to specify '${option}' option`;
|
|
20
|
+
}
|
|
19
21
|
function isObject(item) {
|
|
20
22
|
return typeof item === 'object' && !Array.isArray(item) && item !== null;
|
|
21
23
|
}
|
|
@@ -54,63 +56,32 @@
|
|
|
54
56
|
}
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
|
|
59
|
+
function EventEmitter(isActive) {
|
|
58
60
|
let handlers = [];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
61
|
+
return Object.freeze({
|
|
62
|
+
listen(handler) {
|
|
63
|
+
const handlerWrapper = (e) => {
|
|
64
|
+
handler(e);
|
|
65
|
+
};
|
|
66
|
+
handlers.push(handlerWrapper);
|
|
67
|
+
return {
|
|
68
|
+
unsubscribe() {
|
|
69
|
+
handlers = handlers.filter((i) => handlerWrapper !== i);
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
emit(data) {
|
|
74
|
+
if (isActive()) {
|
|
75
|
+
handlers.forEach((handler) => handler({ value: data }));
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
77
80
|
|
|
78
|
-
|
|
81
|
+
function EventEmitterSelective(isActive, getFallbackNs, getDefaultNs) {
|
|
79
82
|
const listeners = new Set();
|
|
80
83
|
const partialListeners = new Set();
|
|
81
|
-
|
|
82
|
-
listeners.add(handler);
|
|
83
|
-
const result = {
|
|
84
|
-
unsubscribe: () => {
|
|
85
|
-
listeners.delete(handler);
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
return result;
|
|
89
|
-
};
|
|
90
|
-
const listenSome = (handler) => {
|
|
91
|
-
const handlerWrapper = {
|
|
92
|
-
fn: (e) => {
|
|
93
|
-
handler(e);
|
|
94
|
-
},
|
|
95
|
-
namespaces: new Set(),
|
|
96
|
-
};
|
|
97
|
-
partialListeners.add(handlerWrapper);
|
|
98
|
-
const result = {
|
|
99
|
-
unsubscribe: () => {
|
|
100
|
-
partialListeners.delete(handlerWrapper);
|
|
101
|
-
},
|
|
102
|
-
subscribeNs: (ns) => {
|
|
103
|
-
getFallbackArray(ns).forEach((val) => handlerWrapper.namespaces.add(val));
|
|
104
|
-
if (ns === undefined) {
|
|
105
|
-
// subscribing to default ns
|
|
106
|
-
handlerWrapper.namespaces.add(getDefaultNs());
|
|
107
|
-
}
|
|
108
|
-
return result;
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
return result;
|
|
112
|
-
};
|
|
113
|
-
const callHandlers = (ns) => {
|
|
84
|
+
function callHandlers(ns) {
|
|
114
85
|
// everything is implicitly subscribed to fallbacks
|
|
115
86
|
// as it can always fall through to it
|
|
116
87
|
const fallbackNamespaces = new Set(getFallbackNs());
|
|
@@ -121,10 +92,10 @@
|
|
|
121
92
|
handler.fn({ value: undefined });
|
|
122
93
|
}
|
|
123
94
|
});
|
|
124
|
-
}
|
|
95
|
+
}
|
|
125
96
|
let queue = [];
|
|
126
97
|
// merge events in queue into one event
|
|
127
|
-
|
|
98
|
+
function solveQueue() {
|
|
128
99
|
if (queue.length === 0) {
|
|
129
100
|
return;
|
|
130
101
|
}
|
|
@@ -147,75 +118,97 @@
|
|
|
147
118
|
? Array.from(namespaces.keys())
|
|
148
119
|
: undefined;
|
|
149
120
|
callHandlers(namespacesArray);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
121
|
+
}
|
|
122
|
+
return Object.freeze({
|
|
123
|
+
emit(ns, delayed) {
|
|
124
|
+
if (isActive()) {
|
|
125
|
+
queue.push(ns);
|
|
126
|
+
if (!delayed) {
|
|
127
|
+
solveQueue();
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
setTimeout(solveQueue, 0);
|
|
131
|
+
}
|
|
159
132
|
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
133
|
+
},
|
|
134
|
+
listen(handler) {
|
|
135
|
+
listeners.add(handler);
|
|
136
|
+
const result = {
|
|
137
|
+
unsubscribe: () => {
|
|
138
|
+
listeners.delete(handler);
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
return result;
|
|
142
|
+
},
|
|
143
|
+
listenSome(handler) {
|
|
144
|
+
const handlerWrapper = {
|
|
145
|
+
fn: (e) => {
|
|
146
|
+
handler(e);
|
|
147
|
+
},
|
|
148
|
+
namespaces: new Set(),
|
|
149
|
+
};
|
|
150
|
+
partialListeners.add(handlerWrapper);
|
|
151
|
+
const result = {
|
|
152
|
+
unsubscribe: () => {
|
|
153
|
+
partialListeners.delete(handlerWrapper);
|
|
154
|
+
},
|
|
155
|
+
subscribeNs: (ns) => {
|
|
156
|
+
getFallbackArray(ns).forEach((val) => handlerWrapper.namespaces.add(val));
|
|
157
|
+
if (ns === undefined) {
|
|
158
|
+
// subscribing to default ns
|
|
159
|
+
handlerWrapper.namespaces.add(getDefaultNs());
|
|
160
|
+
}
|
|
161
|
+
return result;
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
return result;
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
}
|
|
164
168
|
|
|
165
|
-
|
|
169
|
+
function Events(getFallbackNs, getDefaultNs) {
|
|
166
170
|
let emitterActive = true;
|
|
167
171
|
function isActive() {
|
|
168
172
|
return emitterActive;
|
|
169
173
|
}
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
function setEmitterActive(active) {
|
|
204
|
-
emitterActive = active;
|
|
205
|
-
}
|
|
206
|
-
return Object.freeze({
|
|
207
|
-
onPendingLanguageChange,
|
|
208
|
-
onLanguageChange,
|
|
209
|
-
onLoadingChange,
|
|
210
|
-
onFetchingChange,
|
|
211
|
-
onInitialLoaded,
|
|
212
|
-
onRunningChange,
|
|
213
|
-
onCacheChange,
|
|
214
|
-
onUpdate,
|
|
215
|
-
setEmitterActive,
|
|
216
|
-
on,
|
|
174
|
+
const self = Object.freeze({
|
|
175
|
+
onPendingLanguageChange: EventEmitter(isActive),
|
|
176
|
+
onLanguageChange: EventEmitter(isActive),
|
|
177
|
+
onLoadingChange: EventEmitter(isActive),
|
|
178
|
+
onFetchingChange: EventEmitter(isActive),
|
|
179
|
+
onInitialLoaded: EventEmitter(isActive),
|
|
180
|
+
onRunningChange: EventEmitter(isActive),
|
|
181
|
+
onCacheChange: EventEmitter(isActive),
|
|
182
|
+
onUpdate: EventEmitterSelective(isActive, getFallbackNs, getDefaultNs),
|
|
183
|
+
setEmitterActive(active) {
|
|
184
|
+
emitterActive = active;
|
|
185
|
+
},
|
|
186
|
+
on: ((event, handler) => {
|
|
187
|
+
switch (event) {
|
|
188
|
+
case 'pendingLanguage':
|
|
189
|
+
return self.onPendingLanguageChange.listen(handler);
|
|
190
|
+
case 'language':
|
|
191
|
+
return self.onLanguageChange.listen(handler);
|
|
192
|
+
case 'loading':
|
|
193
|
+
return self.onLoadingChange.listen(handler);
|
|
194
|
+
case 'fetching':
|
|
195
|
+
return self.onFetchingChange.listen(handler);
|
|
196
|
+
case 'initialLoad':
|
|
197
|
+
return self.onInitialLoaded.listen(handler);
|
|
198
|
+
case 'running':
|
|
199
|
+
return self.onRunningChange.listen(handler);
|
|
200
|
+
case 'cache':
|
|
201
|
+
return self.onCacheChange.listen(handler);
|
|
202
|
+
case 'update':
|
|
203
|
+
return self.onUpdate.listen(handler);
|
|
204
|
+
}
|
|
205
|
+
}),
|
|
217
206
|
});
|
|
218
|
-
|
|
207
|
+
self.onInitialLoaded.listen(() => self.onUpdate.emit());
|
|
208
|
+
self.onLanguageChange.listen(() => self.onUpdate.emit());
|
|
209
|
+
self.onCacheChange.listen(({ value }) => self.onUpdate.emit([value.namespace], true));
|
|
210
|
+
return self;
|
|
211
|
+
}
|
|
219
212
|
|
|
220
213
|
const flattenTranslations = (data) => {
|
|
221
214
|
const result = new Map();
|
|
@@ -249,29 +242,11 @@
|
|
|
249
242
|
}
|
|
250
243
|
};
|
|
251
244
|
|
|
252
|
-
|
|
245
|
+
function Cache(onCacheChange, backendGetRecord, backendGetDevRecord, withDefaultNs, isInitialLoading, fetchingObserver, loadingObserver) {
|
|
253
246
|
const asyncRequests = new Map();
|
|
254
247
|
const cache = new Map();
|
|
255
248
|
let staticData = {};
|
|
256
249
|
let version = 0;
|
|
257
|
-
function addStaticData(data) {
|
|
258
|
-
if (data) {
|
|
259
|
-
staticData = Object.assign(Object.assign({}, staticData), data);
|
|
260
|
-
Object.entries(data).forEach(([key, value]) => {
|
|
261
|
-
if (typeof value !== 'function') {
|
|
262
|
-
const descriptor = decodeCacheKey(key);
|
|
263
|
-
const existing = cache.get(key);
|
|
264
|
-
if (!existing || existing.version === 0) {
|
|
265
|
-
addRecordInternal(descriptor, value, 0);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
function invalidate() {
|
|
272
|
-
asyncRequests.clear();
|
|
273
|
-
version += 1;
|
|
274
|
-
}
|
|
275
250
|
function addRecordInternal(descriptor, data, recordVersion) {
|
|
276
251
|
const cacheKey = encodeCacheKey(descriptor);
|
|
277
252
|
cache.set(cacheKey, {
|
|
@@ -280,78 +255,6 @@
|
|
|
280
255
|
});
|
|
281
256
|
onCacheChange.emit(descriptor);
|
|
282
257
|
}
|
|
283
|
-
function addRecord(descriptor, data) {
|
|
284
|
-
addRecordInternal(descriptor, data, version);
|
|
285
|
-
}
|
|
286
|
-
function exists(descriptor, strict = false) {
|
|
287
|
-
const record = cache.get(encodeCacheKey(descriptor));
|
|
288
|
-
if (record && strict) {
|
|
289
|
-
return record.version === version;
|
|
290
|
-
}
|
|
291
|
-
return Boolean(record);
|
|
292
|
-
}
|
|
293
|
-
function getRecord(descriptor) {
|
|
294
|
-
var _a;
|
|
295
|
-
return (_a = cache.get(encodeCacheKey(withDefaultNs(descriptor)))) === null || _a === void 0 ? void 0 : _a.data;
|
|
296
|
-
}
|
|
297
|
-
function getTranslation(descriptor, key) {
|
|
298
|
-
var _a;
|
|
299
|
-
return (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
300
|
-
}
|
|
301
|
-
function getTranslationNs(namespaces, languages, key) {
|
|
302
|
-
var _a;
|
|
303
|
-
for (const namespace of namespaces) {
|
|
304
|
-
for (const language of languages) {
|
|
305
|
-
const value = (_a = cache
|
|
306
|
-
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
307
|
-
if (value !== undefined && value !== null) {
|
|
308
|
-
return [namespace];
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
return unique(namespaces);
|
|
313
|
-
}
|
|
314
|
-
function getTranslationFallback(namespaces, languages, key) {
|
|
315
|
-
var _a;
|
|
316
|
-
for (const namespace of namespaces) {
|
|
317
|
-
for (const language of languages) {
|
|
318
|
-
const value = (_a = cache
|
|
319
|
-
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
320
|
-
if (value !== undefined && value !== null) {
|
|
321
|
-
return value;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return undefined;
|
|
326
|
-
}
|
|
327
|
-
function changeTranslation(descriptor, key, value) {
|
|
328
|
-
var _a;
|
|
329
|
-
const record = (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data;
|
|
330
|
-
record === null || record === void 0 ? void 0 : record.set(key, value);
|
|
331
|
-
onCacheChange.emit(Object.assign(Object.assign({}, descriptor), { key }));
|
|
332
|
-
}
|
|
333
|
-
function isFetching(ns) {
|
|
334
|
-
if (isInitialLoading()) {
|
|
335
|
-
return true;
|
|
336
|
-
}
|
|
337
|
-
if (ns === undefined) {
|
|
338
|
-
return asyncRequests.size > 0;
|
|
339
|
-
}
|
|
340
|
-
const namespaces = getFallbackArray(ns);
|
|
341
|
-
return Boolean(Array.from(asyncRequests.keys()).find((key) => namespaces.includes(decodeCacheKey(key).namespace)));
|
|
342
|
-
}
|
|
343
|
-
function isLoading(language, ns) {
|
|
344
|
-
const namespaces = getFallbackArray(ns);
|
|
345
|
-
return Boolean(isInitialLoading() ||
|
|
346
|
-
Array.from(asyncRequests.keys()).find((key) => {
|
|
347
|
-
const descriptor = decodeCacheKey(key);
|
|
348
|
-
return ((!namespaces.length || namespaces.includes(descriptor.namespace)) &&
|
|
349
|
-
!exists({
|
|
350
|
-
namespace: descriptor.namespace,
|
|
351
|
-
language: language,
|
|
352
|
-
}));
|
|
353
|
-
}));
|
|
354
|
-
}
|
|
355
258
|
/**
|
|
356
259
|
* Fetches production data
|
|
357
260
|
*/
|
|
@@ -384,73 +287,152 @@
|
|
|
384
287
|
}
|
|
385
288
|
return dataPromise;
|
|
386
289
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
290
|
+
const self = Object.freeze({
|
|
291
|
+
addStaticData(data) {
|
|
292
|
+
if (data) {
|
|
293
|
+
staticData = Object.assign(Object.assign({}, staticData), data);
|
|
294
|
+
Object.entries(data).forEach(([key, value]) => {
|
|
295
|
+
if (typeof value !== 'function') {
|
|
296
|
+
const descriptor = decodeCacheKey(key);
|
|
297
|
+
const existing = cache.get(key);
|
|
298
|
+
if (!existing || existing.version === 0) {
|
|
299
|
+
addRecordInternal(descriptor, value, 0);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
invalidate() {
|
|
306
|
+
asyncRequests.clear();
|
|
307
|
+
version += 1;
|
|
308
|
+
},
|
|
309
|
+
addRecord(descriptor, data) {
|
|
310
|
+
addRecordInternal(descriptor, data, version);
|
|
311
|
+
},
|
|
312
|
+
exists(descriptor, strict = false) {
|
|
313
|
+
const record = cache.get(encodeCacheKey(descriptor));
|
|
314
|
+
if (record && strict) {
|
|
315
|
+
return record.version === version;
|
|
316
|
+
}
|
|
317
|
+
return Boolean(record);
|
|
318
|
+
},
|
|
319
|
+
getRecord(descriptor) {
|
|
320
|
+
var _a;
|
|
321
|
+
return (_a = cache.get(encodeCacheKey(withDefaultNs(descriptor)))) === null || _a === void 0 ? void 0 : _a.data;
|
|
322
|
+
},
|
|
323
|
+
getTranslation(descriptor, key) {
|
|
324
|
+
var _a;
|
|
325
|
+
return (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
326
|
+
},
|
|
327
|
+
getTranslationNs(namespaces, languages, key) {
|
|
328
|
+
var _a;
|
|
329
|
+
for (const namespace of namespaces) {
|
|
330
|
+
for (const language of languages) {
|
|
331
|
+
const value = (_a = cache
|
|
332
|
+
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
333
|
+
if (value !== undefined && value !== null) {
|
|
334
|
+
return [namespace];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return unique(namespaces);
|
|
339
|
+
},
|
|
340
|
+
getTranslationFallback(namespaces, languages, key) {
|
|
341
|
+
var _a;
|
|
342
|
+
for (const namespace of namespaces) {
|
|
343
|
+
for (const language of languages) {
|
|
344
|
+
const value = (_a = cache
|
|
345
|
+
.get(encodeCacheKey({ language, namespace }))) === null || _a === void 0 ? void 0 : _a.data.get(key);
|
|
346
|
+
if (value !== undefined && value !== null) {
|
|
347
|
+
return value;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return undefined;
|
|
352
|
+
},
|
|
353
|
+
changeTranslation(descriptor, key, value) {
|
|
354
|
+
var _a;
|
|
355
|
+
const record = (_a = cache.get(encodeCacheKey(descriptor))) === null || _a === void 0 ? void 0 : _a.data;
|
|
356
|
+
record === null || record === void 0 ? void 0 : record.set(key, value);
|
|
357
|
+
onCacheChange.emit(Object.assign(Object.assign({}, descriptor), { key }));
|
|
358
|
+
},
|
|
359
|
+
isFetching(ns) {
|
|
360
|
+
if (isInitialLoading()) {
|
|
361
|
+
return true;
|
|
362
|
+
}
|
|
363
|
+
if (ns === undefined) {
|
|
364
|
+
return asyncRequests.size > 0;
|
|
365
|
+
}
|
|
366
|
+
const namespaces = getFallbackArray(ns);
|
|
367
|
+
return Boolean(Array.from(asyncRequests.keys()).find((key) => namespaces.includes(decodeCacheKey(key).namespace)));
|
|
368
|
+
},
|
|
369
|
+
isLoading(language, ns) {
|
|
370
|
+
const namespaces = getFallbackArray(ns);
|
|
371
|
+
return Boolean(isInitialLoading() ||
|
|
372
|
+
Array.from(asyncRequests.keys()).find((key) => {
|
|
373
|
+
const descriptor = decodeCacheKey(key);
|
|
374
|
+
return ((!namespaces.length ||
|
|
375
|
+
namespaces.includes(descriptor.namespace)) &&
|
|
376
|
+
!self.exists({
|
|
377
|
+
namespace: descriptor.namespace,
|
|
378
|
+
language: language,
|
|
379
|
+
}));
|
|
380
|
+
}));
|
|
381
|
+
},
|
|
382
|
+
async loadRecords(descriptors, isDev) {
|
|
383
|
+
const withPromises = descriptors.map((descriptor) => {
|
|
384
|
+
const keyObject = withDefaultNs(descriptor);
|
|
385
|
+
const cacheKey = encodeCacheKey(keyObject);
|
|
386
|
+
const existingPromise = asyncRequests.get(cacheKey);
|
|
387
|
+
if (existingPromise) {
|
|
388
|
+
return {
|
|
389
|
+
new: false,
|
|
390
|
+
promise: existingPromise,
|
|
391
|
+
keyObject,
|
|
392
|
+
cacheKey,
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
const dataPromise = fetchData(keyObject, isDev) || Promise.resolve(undefined);
|
|
396
|
+
asyncRequests.set(cacheKey, dataPromise);
|
|
393
397
|
return {
|
|
394
|
-
new:
|
|
395
|
-
promise:
|
|
398
|
+
new: true,
|
|
399
|
+
promise: dataPromise,
|
|
396
400
|
keyObject,
|
|
397
401
|
cacheKey,
|
|
398
402
|
};
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
promise
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
asyncRequests.delete(value.cacheKey);
|
|
418
|
-
const data = results[i];
|
|
419
|
-
if (data) {
|
|
420
|
-
addRecord(value.keyObject, data);
|
|
421
|
-
}
|
|
422
|
-
else if (!getRecord(value.keyObject)) {
|
|
423
|
-
// if no data exist, put empty object
|
|
424
|
-
addRecord(value.keyObject, {});
|
|
403
|
+
});
|
|
404
|
+
fetchingObserver.notify();
|
|
405
|
+
loadingObserver.notify();
|
|
406
|
+
const results = await Promise.all(withPromises.map((val) => val.promise));
|
|
407
|
+
withPromises.forEach((value, i) => {
|
|
408
|
+
const promiseChanged = asyncRequests.get(value.cacheKey) !== value.promise;
|
|
409
|
+
// if promise has changed in between, it means cache been invalidated or
|
|
410
|
+
// new data are being fetched
|
|
411
|
+
if (value.new && !promiseChanged) {
|
|
412
|
+
asyncRequests.delete(value.cacheKey);
|
|
413
|
+
const data = results[i];
|
|
414
|
+
if (data) {
|
|
415
|
+
self.addRecord(value.keyObject, data);
|
|
416
|
+
}
|
|
417
|
+
else if (!self.getRecord(value.keyObject)) {
|
|
418
|
+
// if no data exist, put empty object
|
|
419
|
+
self.addRecord(value.keyObject, {});
|
|
420
|
+
}
|
|
425
421
|
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
return Object.freeze({
|
|
439
|
-
addStaticData,
|
|
440
|
-
invalidate,
|
|
441
|
-
addRecord,
|
|
442
|
-
exists,
|
|
443
|
-
getRecord,
|
|
444
|
-
getTranslation,
|
|
445
|
-
getTranslationNs,
|
|
446
|
-
getTranslationFallback,
|
|
447
|
-
changeTranslation,
|
|
448
|
-
isFetching,
|
|
449
|
-
isLoading,
|
|
450
|
-
loadRecords,
|
|
451
|
-
getAllRecords,
|
|
422
|
+
});
|
|
423
|
+
fetchingObserver.notify();
|
|
424
|
+
loadingObserver.notify();
|
|
425
|
+
return withPromises.map((val) => self.getRecord(val.keyObject));
|
|
426
|
+
},
|
|
427
|
+
getAllRecords() {
|
|
428
|
+
const entries = Array.from(cache.entries());
|
|
429
|
+
return entries.map(([key, entry]) => {
|
|
430
|
+
return Object.assign(Object.assign({}, decodeCacheKey(key)), { data: entry.data });
|
|
431
|
+
});
|
|
432
|
+
},
|
|
452
433
|
});
|
|
453
|
-
|
|
434
|
+
return self;
|
|
435
|
+
}
|
|
454
436
|
|
|
455
437
|
/******************************************************************************
|
|
456
438
|
Copyright (c) Microsoft Corporation.
|
|
@@ -511,7 +493,7 @@
|
|
|
511
493
|
});
|
|
512
494
|
return result;
|
|
513
495
|
};
|
|
514
|
-
|
|
496
|
+
function initState(options, previousState) {
|
|
515
497
|
const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options);
|
|
516
498
|
// remove extra '/' from url end
|
|
517
499
|
initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl);
|
|
@@ -523,9 +505,9 @@
|
|
|
523
505
|
isInitialLoading: false,
|
|
524
506
|
isRunning: false,
|
|
525
507
|
};
|
|
526
|
-
}
|
|
508
|
+
}
|
|
527
509
|
|
|
528
|
-
|
|
510
|
+
function Plugins(getLanguage, getInitialOptions, getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation) {
|
|
529
511
|
const plugins = {
|
|
530
512
|
ui: undefined,
|
|
531
513
|
};
|
|
@@ -554,63 +536,44 @@
|
|
|
554
536
|
});
|
|
555
537
|
(_a = instances.ui) === null || _a === void 0 ? void 0 : _a.handleElementClick(withNs, event);
|
|
556
538
|
};
|
|
557
|
-
const stop = () => {
|
|
558
|
-
var _a;
|
|
559
|
-
instances.ui = undefined;
|
|
560
|
-
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.stop();
|
|
561
|
-
};
|
|
562
|
-
const highlight = (key, ns) => {
|
|
563
|
-
var _a, _b;
|
|
564
|
-
return ((_b = (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.highlight) === null || _b === void 0 ? void 0 : _b.call(_a, key, ns)) || { unhighlight() { } };
|
|
565
|
-
};
|
|
566
539
|
const findPositions = (key, ns) => {
|
|
567
540
|
var _a;
|
|
568
541
|
return ((_a = instances.observer) === null || _a === void 0 ? void 0 : _a.findPositions(key, ns)) || [];
|
|
569
542
|
};
|
|
570
|
-
|
|
543
|
+
function translate(props) {
|
|
571
544
|
const translation = getTranslation({
|
|
572
545
|
key: props.key,
|
|
573
546
|
ns: props.ns,
|
|
574
547
|
});
|
|
575
|
-
return formatTranslation(Object.assign(Object.assign({}, props), { translation, formatEnabled: true }));
|
|
576
|
-
}
|
|
577
|
-
|
|
548
|
+
return self.formatTranslation(Object.assign(Object.assign({}, props), { translation, formatEnabled: true }));
|
|
549
|
+
}
|
|
550
|
+
function setObserver(observer) {
|
|
578
551
|
instances.observer = observer === null || observer === void 0 ? void 0 : observer();
|
|
579
|
-
}
|
|
580
|
-
|
|
552
|
+
}
|
|
553
|
+
function hasObserver() {
|
|
581
554
|
return Boolean(instances.observer);
|
|
582
|
-
}
|
|
583
|
-
|
|
555
|
+
}
|
|
556
|
+
function addFormatter(formatter) {
|
|
584
557
|
if (formatter) {
|
|
585
558
|
instances.formatters.push(formatter);
|
|
586
559
|
}
|
|
587
|
-
}
|
|
588
|
-
|
|
560
|
+
}
|
|
561
|
+
function setFinalFormatter(formatter) {
|
|
589
562
|
instances.finalFormatter = formatter;
|
|
590
|
-
}
|
|
591
|
-
|
|
563
|
+
}
|
|
564
|
+
function setUi(ui) {
|
|
592
565
|
plugins.ui = ui;
|
|
593
|
-
}
|
|
594
|
-
|
|
566
|
+
}
|
|
567
|
+
function hasUi() {
|
|
595
568
|
return Boolean(plugins.ui);
|
|
596
|
-
}
|
|
597
|
-
|
|
569
|
+
}
|
|
570
|
+
function setLanguageStorage(storage) {
|
|
598
571
|
instances.languageStorage = storage;
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
return instances.languageStorage;
|
|
602
|
-
};
|
|
603
|
-
const setStoredLanguage = (language) => {
|
|
604
|
-
var _a;
|
|
605
|
-
(_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.setLanguage(language);
|
|
606
|
-
};
|
|
607
|
-
const setLanguageDetector = (detector) => {
|
|
572
|
+
}
|
|
573
|
+
function setLanguageDetector(detector) {
|
|
608
574
|
instances.languageDetector = detector;
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
return instances.languageDetector;
|
|
612
|
-
};
|
|
613
|
-
const detectLanguage = () => {
|
|
575
|
+
}
|
|
576
|
+
function detectLanguage() {
|
|
614
577
|
if (!instances.languageDetector) {
|
|
615
578
|
return undefined;
|
|
616
579
|
}
|
|
@@ -618,86 +581,15 @@
|
|
|
618
581
|
return instances.languageDetector.getLanguage({
|
|
619
582
|
availableLanguages,
|
|
620
583
|
});
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
var _a;
|
|
624
|
-
const availableLanguages = getAvailableLanguages();
|
|
625
|
-
const languageOrPromise = (_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.getLanguage();
|
|
626
|
-
return valueOrPromise(languageOrPromise, (language) => {
|
|
627
|
-
if ((!availableLanguages || availableLanguages.includes(language)) &&
|
|
628
|
-
language) {
|
|
629
|
-
return language;
|
|
630
|
-
}
|
|
631
|
-
return detectLanguage();
|
|
632
|
-
});
|
|
633
|
-
};
|
|
634
|
-
const addBackend = (backend) => {
|
|
584
|
+
}
|
|
585
|
+
function addBackend(backend) {
|
|
635
586
|
if (backend) {
|
|
636
587
|
instances.backends.push(backend);
|
|
637
588
|
}
|
|
638
|
-
}
|
|
639
|
-
|
|
589
|
+
}
|
|
590
|
+
function setDevBackend(backend) {
|
|
640
591
|
instances.devBackend = backend;
|
|
641
|
-
}
|
|
642
|
-
const run = () => {
|
|
643
|
-
var _a, _b;
|
|
644
|
-
const { apiKey, apiUrl, projectId, observerOptions } = getInitialOptions();
|
|
645
|
-
instances.ui = (_a = plugins.ui) === null || _a === void 0 ? void 0 : _a.call(plugins, {
|
|
646
|
-
apiKey: apiKey,
|
|
647
|
-
apiUrl: apiUrl,
|
|
648
|
-
projectId,
|
|
649
|
-
highlight,
|
|
650
|
-
changeTranslation,
|
|
651
|
-
findPositions,
|
|
652
|
-
});
|
|
653
|
-
(_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({
|
|
654
|
-
mouseHighlight: true,
|
|
655
|
-
options: observerOptions,
|
|
656
|
-
translate,
|
|
657
|
-
onClick,
|
|
658
|
-
});
|
|
659
|
-
};
|
|
660
|
-
const getDevBackend = () => {
|
|
661
|
-
return instances.devBackend;
|
|
662
|
-
};
|
|
663
|
-
const getBackendDevRecord = ({ language, namespace }) => {
|
|
664
|
-
var _a;
|
|
665
|
-
const { apiKey, apiUrl, projectId } = getInitialOptions();
|
|
666
|
-
return (_a = instances.devBackend) === null || _a === void 0 ? void 0 : _a.getRecord({
|
|
667
|
-
apiKey,
|
|
668
|
-
apiUrl,
|
|
669
|
-
projectId,
|
|
670
|
-
language,
|
|
671
|
-
namespace,
|
|
672
|
-
});
|
|
673
|
-
};
|
|
674
|
-
const getBackendRecord = ({ language, namespace }) => {
|
|
675
|
-
for (const backend of instances.backends) {
|
|
676
|
-
const data = backend.getRecord({ language, namespace });
|
|
677
|
-
if (isPromise(data)) {
|
|
678
|
-
return data === null || data === void 0 ? void 0 : data.catch((e) => {
|
|
679
|
-
// eslint-disable-next-line no-console
|
|
680
|
-
console.error(e);
|
|
681
|
-
return {};
|
|
682
|
-
});
|
|
683
|
-
}
|
|
684
|
-
if (data !== undefined) {
|
|
685
|
-
return data;
|
|
686
|
-
}
|
|
687
|
-
}
|
|
688
|
-
return undefined;
|
|
689
|
-
};
|
|
690
|
-
const unwrap = (text) => {
|
|
691
|
-
var _a;
|
|
692
|
-
if (instances.observer) {
|
|
693
|
-
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.unwrap(text);
|
|
694
|
-
}
|
|
695
|
-
return { text, keys: [] };
|
|
696
|
-
};
|
|
697
|
-
const retranslate = () => {
|
|
698
|
-
var _a;
|
|
699
|
-
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.retranslate();
|
|
700
|
-
};
|
|
592
|
+
}
|
|
701
593
|
function addPlugin(tolgeeInstance, plugin) {
|
|
702
594
|
const pluginTools = Object.freeze({
|
|
703
595
|
setFinalFormatter,
|
|
@@ -713,252 +605,308 @@
|
|
|
713
605
|
});
|
|
714
606
|
plugin(tolgeeInstance, pluginTools);
|
|
715
607
|
}
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
608
|
+
const self = Object.freeze({
|
|
609
|
+
addPlugin,
|
|
610
|
+
run() {
|
|
611
|
+
var _a, _b;
|
|
612
|
+
const { apiKey, apiUrl, projectId, observerOptions } = getInitialOptions();
|
|
613
|
+
instances.ui = (_a = plugins.ui) === null || _a === void 0 ? void 0 : _a.call(plugins, {
|
|
614
|
+
apiKey: apiKey,
|
|
615
|
+
apiUrl: apiUrl,
|
|
616
|
+
projectId,
|
|
617
|
+
highlight: self.highlight,
|
|
618
|
+
changeTranslation,
|
|
619
|
+
findPositions,
|
|
620
|
+
});
|
|
621
|
+
(_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({
|
|
622
|
+
mouseHighlight: true,
|
|
623
|
+
options: observerOptions,
|
|
624
|
+
translate,
|
|
625
|
+
onClick,
|
|
626
|
+
});
|
|
627
|
+
},
|
|
628
|
+
stop() {
|
|
629
|
+
var _a;
|
|
630
|
+
instances.ui = undefined;
|
|
631
|
+
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.stop();
|
|
632
|
+
},
|
|
633
|
+
getLanguageStorage() {
|
|
634
|
+
return instances.languageStorage;
|
|
635
|
+
},
|
|
636
|
+
getInitialLanguage() {
|
|
637
|
+
var _a;
|
|
638
|
+
const availableLanguages = getAvailableLanguages();
|
|
639
|
+
const languageOrPromise = (_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.getLanguage();
|
|
640
|
+
return valueOrPromise(languageOrPromise, (language) => {
|
|
641
|
+
if ((!availableLanguages || availableLanguages.includes(language)) &&
|
|
642
|
+
language) {
|
|
643
|
+
return language;
|
|
644
|
+
}
|
|
645
|
+
return detectLanguage();
|
|
646
|
+
});
|
|
647
|
+
},
|
|
648
|
+
setStoredLanguage(language) {
|
|
649
|
+
var _a;
|
|
650
|
+
(_a = instances.languageStorage) === null || _a === void 0 ? void 0 : _a.setLanguage(language);
|
|
651
|
+
},
|
|
652
|
+
getDevBackend() {
|
|
653
|
+
return instances.devBackend;
|
|
654
|
+
},
|
|
655
|
+
getBackendRecord: (({ language, namespace }) => {
|
|
656
|
+
for (const backend of instances.backends) {
|
|
657
|
+
const data = backend.getRecord({ language, namespace });
|
|
658
|
+
if (isPromise(data)) {
|
|
659
|
+
return data === null || data === void 0 ? void 0 : data.catch((e) => {
|
|
660
|
+
// eslint-disable-next-line no-console
|
|
661
|
+
console.error(e);
|
|
662
|
+
return {};
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
if (data !== undefined) {
|
|
666
|
+
return data;
|
|
667
|
+
}
|
|
733
668
|
}
|
|
734
|
-
return
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
669
|
+
return undefined;
|
|
670
|
+
}),
|
|
671
|
+
getBackendDevRecord: (({ language, namespace }) => {
|
|
672
|
+
var _a;
|
|
673
|
+
const { apiKey, apiUrl, projectId } = getInitialOptions();
|
|
674
|
+
return (_a = instances.devBackend) === null || _a === void 0 ? void 0 : _a.getRecord({
|
|
675
|
+
apiKey,
|
|
676
|
+
apiUrl,
|
|
677
|
+
projectId,
|
|
678
|
+
language,
|
|
679
|
+
namespace,
|
|
680
|
+
});
|
|
681
|
+
}),
|
|
682
|
+
getLanguageDetector() {
|
|
683
|
+
return instances.languageDetector;
|
|
684
|
+
},
|
|
685
|
+
retranslate() {
|
|
686
|
+
var _a;
|
|
687
|
+
(_a = instances.observer) === null || _a === void 0 ? void 0 : _a.retranslate();
|
|
688
|
+
},
|
|
689
|
+
highlight: ((key, ns) => {
|
|
690
|
+
var _a, _b;
|
|
691
|
+
return ((_b = (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.highlight) === null || _b === void 0 ? void 0 : _b.call(_a, key, ns)) || { unhighlight() { } };
|
|
692
|
+
}),
|
|
693
|
+
unwrap(text) {
|
|
694
|
+
var _a;
|
|
695
|
+
if (instances.observer) {
|
|
696
|
+
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.unwrap(text);
|
|
697
|
+
}
|
|
698
|
+
return { text, keys: [] };
|
|
699
|
+
},
|
|
700
|
+
wrap(params) {
|
|
701
|
+
var _a;
|
|
702
|
+
if (instances.observer) {
|
|
703
|
+
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.wrap(params);
|
|
704
|
+
}
|
|
705
|
+
return params.translation;
|
|
706
|
+
},
|
|
707
|
+
hasDevBackend() {
|
|
708
|
+
return Boolean(self.getDevBackend());
|
|
709
|
+
},
|
|
710
|
+
formatTranslation(_a) {
|
|
711
|
+
var _b;
|
|
712
|
+
var { formatEnabled } = _a, props = __rest(_a, ["formatEnabled"]);
|
|
713
|
+
const { key, translation, defaultValue, noWrap, params, orEmpty, ns } = props;
|
|
714
|
+
const formattableTranslation = translation || defaultValue;
|
|
715
|
+
let result = formattableTranslation || (orEmpty ? '' : key);
|
|
716
|
+
const language = getLanguage();
|
|
717
|
+
const isFormatEnabled = formatEnabled || !((_b = instances.observer) === null || _b === void 0 ? void 0 : _b.outputNotFormattable);
|
|
718
|
+
const wrap = (result) => {
|
|
719
|
+
if (instances.observer && !noWrap) {
|
|
720
|
+
return instances.observer.wrap({
|
|
721
|
+
key,
|
|
722
|
+
translation: result,
|
|
723
|
+
defaultValue,
|
|
724
|
+
params,
|
|
725
|
+
ns,
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
return result;
|
|
729
|
+
};
|
|
730
|
+
result = wrap(result);
|
|
731
|
+
try {
|
|
732
|
+
if (formattableTranslation && language && isFormatEnabled) {
|
|
733
|
+
for (const formatter of instances.formatters) {
|
|
734
|
+
result = formatter.format({
|
|
735
|
+
translation: result,
|
|
736
|
+
language,
|
|
737
|
+
params,
|
|
738
|
+
});
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
if (instances.finalFormatter &&
|
|
742
|
+
formattableTranslation &&
|
|
743
|
+
language &&
|
|
744
|
+
isFormatEnabled) {
|
|
745
|
+
result = instances.finalFormatter.format({
|
|
741
746
|
translation: result,
|
|
742
747
|
language,
|
|
743
748
|
params,
|
|
744
749
|
});
|
|
745
750
|
}
|
|
746
751
|
}
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
if (formatErrorType === 'string') {
|
|
765
|
-
result = onFormatError;
|
|
766
|
-
}
|
|
767
|
-
else if (formatErrorType === 'function') {
|
|
768
|
-
result = onFormatError(errorMessage, props);
|
|
769
|
-
}
|
|
770
|
-
else {
|
|
771
|
-
result = DEFAULT_FORMAT_ERROR;
|
|
752
|
+
catch (e) {
|
|
753
|
+
// eslint-disable-next-line no-console
|
|
754
|
+
console.error(e);
|
|
755
|
+
const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR;
|
|
756
|
+
const onFormatError = getInitialOptions().onFormatError;
|
|
757
|
+
const formatErrorType = typeof onFormatError;
|
|
758
|
+
if (formatErrorType === 'string') {
|
|
759
|
+
result = onFormatError;
|
|
760
|
+
}
|
|
761
|
+
else if (formatErrorType === 'function') {
|
|
762
|
+
result = onFormatError(errorMessage, props);
|
|
763
|
+
}
|
|
764
|
+
else {
|
|
765
|
+
result = DEFAULT_FORMAT_ERROR;
|
|
766
|
+
}
|
|
767
|
+
// wrap error message, so it's detectable
|
|
768
|
+
result = wrap(result);
|
|
772
769
|
}
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
}
|
|
776
|
-
return result;
|
|
777
|
-
}
|
|
778
|
-
function hasDevBackend() {
|
|
779
|
-
return Boolean(getDevBackend());
|
|
780
|
-
}
|
|
781
|
-
const wrap = (params) => {
|
|
782
|
-
var _a;
|
|
783
|
-
if (instances.observer) {
|
|
784
|
-
return (_a = instances.observer) === null || _a === void 0 ? void 0 : _a.wrap(params);
|
|
785
|
-
}
|
|
786
|
-
return params.translation;
|
|
787
|
-
};
|
|
788
|
-
return Object.freeze({
|
|
789
|
-
addPlugin,
|
|
790
|
-
formatTranslation,
|
|
791
|
-
getDevBackend,
|
|
792
|
-
getBackendRecord,
|
|
793
|
-
getBackendDevRecord,
|
|
794
|
-
getLanguageDetector,
|
|
795
|
-
getLanguageStorage,
|
|
796
|
-
getInitialLanguage,
|
|
797
|
-
setStoredLanguage,
|
|
798
|
-
run,
|
|
799
|
-
stop,
|
|
800
|
-
retranslate,
|
|
801
|
-
highlight,
|
|
802
|
-
unwrap,
|
|
803
|
-
wrap,
|
|
804
|
-
hasDevBackend,
|
|
770
|
+
return result;
|
|
771
|
+
},
|
|
805
772
|
});
|
|
806
|
-
|
|
773
|
+
return self;
|
|
774
|
+
}
|
|
807
775
|
|
|
808
776
|
const ValueObserver = (initialValue, valueGetter, handler) => {
|
|
809
777
|
let previousValue = initialValue;
|
|
810
|
-
function init(value) {
|
|
811
|
-
previousValue = value;
|
|
812
|
-
}
|
|
813
|
-
function notify() {
|
|
814
|
-
const value = valueGetter();
|
|
815
|
-
if (previousValue !== value) {
|
|
816
|
-
handler(value);
|
|
817
|
-
}
|
|
818
|
-
previousValue = value;
|
|
819
|
-
}
|
|
820
778
|
return Object.freeze({
|
|
821
|
-
init
|
|
822
|
-
|
|
779
|
+
init(value) {
|
|
780
|
+
previousValue = value;
|
|
781
|
+
},
|
|
782
|
+
notify() {
|
|
783
|
+
const value = valueGetter();
|
|
784
|
+
if (previousValue !== value) {
|
|
785
|
+
handler(value);
|
|
786
|
+
}
|
|
787
|
+
previousValue = value;
|
|
788
|
+
},
|
|
823
789
|
});
|
|
824
790
|
};
|
|
825
791
|
|
|
826
|
-
|
|
792
|
+
function State(onLanguageChange, onPendingLanguageChange, onRunningChange) {
|
|
827
793
|
let state = initState();
|
|
828
794
|
let devCredentials = undefined;
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
state.isRunning
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
}
|
|
841
|
-
function isInitialLoading() {
|
|
842
|
-
return state.isInitialLoading;
|
|
843
|
-
}
|
|
844
|
-
function setInitialLoading(value) {
|
|
845
|
-
state.isInitialLoading = value;
|
|
846
|
-
}
|
|
847
|
-
function getLanguage() {
|
|
848
|
-
return state.language || state.initialOptions.language;
|
|
849
|
-
}
|
|
850
|
-
function setLanguage(language) {
|
|
851
|
-
if (state.language !== language) {
|
|
852
|
-
state.language = language;
|
|
853
|
-
onLanguageChange.emit(language);
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
function getPendingLanguage() {
|
|
857
|
-
return state.pendingLanguage || getLanguage();
|
|
858
|
-
}
|
|
859
|
-
function setPendingLanguage(language) {
|
|
860
|
-
if (state.pendingLanguage !== language) {
|
|
861
|
-
state.pendingLanguage = language;
|
|
862
|
-
onPendingLanguageChange.emit(language);
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
function getInitialOptions() {
|
|
866
|
-
return Object.assign(Object.assign({}, state.initialOptions), devCredentials);
|
|
867
|
-
}
|
|
868
|
-
function addActiveNs(ns) {
|
|
869
|
-
const namespaces = getFallbackArray(ns);
|
|
870
|
-
namespaces.forEach((namespace) => {
|
|
871
|
-
const value = state.activeNamespaces.get(namespace);
|
|
872
|
-
if (value !== undefined) {
|
|
873
|
-
state.activeNamespaces.set(namespace, value + 1);
|
|
795
|
+
const self = Object.freeze({
|
|
796
|
+
init(options) {
|
|
797
|
+
state = initState(options, state);
|
|
798
|
+
},
|
|
799
|
+
isRunning() {
|
|
800
|
+
return state.isRunning;
|
|
801
|
+
},
|
|
802
|
+
setRunning(value) {
|
|
803
|
+
if (state.isRunning !== value) {
|
|
804
|
+
state.isRunning = value;
|
|
805
|
+
onRunningChange.emit(value);
|
|
874
806
|
}
|
|
875
|
-
|
|
876
|
-
|
|
807
|
+
},
|
|
808
|
+
isInitialLoading() {
|
|
809
|
+
return state.isInitialLoading;
|
|
810
|
+
},
|
|
811
|
+
setInitialLoading(value) {
|
|
812
|
+
state.isInitialLoading = value;
|
|
813
|
+
},
|
|
814
|
+
getLanguage() {
|
|
815
|
+
return state.language || state.initialOptions.language;
|
|
816
|
+
},
|
|
817
|
+
setLanguage(language) {
|
|
818
|
+
if (state.language !== language) {
|
|
819
|
+
state.language = language;
|
|
820
|
+
onLanguageChange.emit(language);
|
|
877
821
|
}
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
822
|
+
},
|
|
823
|
+
getPendingLanguage() {
|
|
824
|
+
return state.pendingLanguage || self.getLanguage();
|
|
825
|
+
},
|
|
826
|
+
setPendingLanguage(language) {
|
|
827
|
+
if (state.pendingLanguage !== language) {
|
|
828
|
+
state.pendingLanguage = language;
|
|
829
|
+
onPendingLanguageChange.emit(language);
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
getInitialOptions() {
|
|
833
|
+
return Object.assign(Object.assign({}, state.initialOptions), devCredentials);
|
|
834
|
+
},
|
|
835
|
+
addActiveNs(ns) {
|
|
836
|
+
const namespaces = getFallbackArray(ns);
|
|
837
|
+
namespaces.forEach((namespace) => {
|
|
838
|
+
const value = state.activeNamespaces.get(namespace);
|
|
839
|
+
if (value !== undefined) {
|
|
840
|
+
state.activeNamespaces.set(namespace, value + 1);
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
state.activeNamespaces.set(namespace, 1);
|
|
844
|
+
}
|
|
845
|
+
});
|
|
846
|
+
},
|
|
847
|
+
removeActiveNs(ns) {
|
|
848
|
+
const namespaces = getFallbackArray(ns);
|
|
849
|
+
namespaces.forEach((namespace) => {
|
|
850
|
+
const value = state.activeNamespaces.get(namespace);
|
|
851
|
+
if (value !== undefined && value > 1) {
|
|
852
|
+
state.activeNamespaces.set(namespace, value - 1);
|
|
853
|
+
}
|
|
854
|
+
else {
|
|
855
|
+
state.activeNamespaces.delete(namespace);
|
|
856
|
+
}
|
|
857
|
+
});
|
|
858
|
+
},
|
|
859
|
+
getRequiredNamespaces() {
|
|
860
|
+
return unique([
|
|
861
|
+
...(state.initialOptions.ns || [state.initialOptions.defaultNs]),
|
|
862
|
+
...getFallbackArray(state.initialOptions.fallbackNs),
|
|
863
|
+
...state.activeNamespaces.keys(),
|
|
864
|
+
]);
|
|
865
|
+
},
|
|
866
|
+
getFallbackLangs(lang) {
|
|
867
|
+
const language = lang || self.getLanguage();
|
|
868
|
+
if (!language) {
|
|
869
|
+
return [];
|
|
870
|
+
}
|
|
871
|
+
return unique([
|
|
872
|
+
language,
|
|
873
|
+
...getFallbackFromStruct(language, state.initialOptions.fallbackLanguage),
|
|
874
|
+
]);
|
|
875
|
+
},
|
|
876
|
+
getFallbackNs() {
|
|
877
|
+
return getFallbackArray(state.initialOptions.fallbackNs);
|
|
878
|
+
},
|
|
879
|
+
getDefaultNs(ns) {
|
|
880
|
+
return ns === undefined ? state.initialOptions.defaultNs : ns;
|
|
881
|
+
},
|
|
882
|
+
getAvailableLanguages() {
|
|
883
|
+
if (state.initialOptions.availableLanguages) {
|
|
884
|
+
return state.initialOptions.availableLanguages;
|
|
885
|
+
}
|
|
886
|
+
else if (state.initialOptions.staticData) {
|
|
887
|
+
const languagesFromStaticData = Object.keys(state.initialOptions.staticData).map((key) => decodeCacheKey(key).language);
|
|
888
|
+
return Array.from(new Set(languagesFromStaticData));
|
|
889
|
+
}
|
|
890
|
+
},
|
|
891
|
+
withDefaultNs(descriptor) {
|
|
892
|
+
return {
|
|
893
|
+
namespace: descriptor.namespace === undefined
|
|
894
|
+
? self.getInitialOptions().defaultNs
|
|
895
|
+
: descriptor.namespace,
|
|
896
|
+
language: descriptor.language,
|
|
897
|
+
};
|
|
898
|
+
},
|
|
899
|
+
overrideCredentials(credentials) {
|
|
900
|
+
if (credentials) {
|
|
901
|
+
devCredentials = Object.assign(Object.assign({}, credentials), { apiUrl: sanitizeUrl(credentials.apiUrl) });
|
|
886
902
|
}
|
|
887
903
|
else {
|
|
888
|
-
|
|
904
|
+
devCredentials = undefined;
|
|
889
905
|
}
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
function getRequiredNamespaces() {
|
|
893
|
-
return unique([
|
|
894
|
-
...(state.initialOptions.ns || [state.initialOptions.defaultNs]),
|
|
895
|
-
...getFallbackArray(state.initialOptions.fallbackNs),
|
|
896
|
-
...state.activeNamespaces.keys(),
|
|
897
|
-
]);
|
|
898
|
-
}
|
|
899
|
-
function getFallbackLangs(lang) {
|
|
900
|
-
const language = lang || getLanguage();
|
|
901
|
-
if (!language) {
|
|
902
|
-
return [];
|
|
903
|
-
}
|
|
904
|
-
return unique([
|
|
905
|
-
language,
|
|
906
|
-
...getFallbackFromStruct(language, state.initialOptions.fallbackLanguage),
|
|
907
|
-
]);
|
|
908
|
-
}
|
|
909
|
-
function getFallbackNs() {
|
|
910
|
-
return getFallbackArray(state.initialOptions.fallbackNs);
|
|
911
|
-
}
|
|
912
|
-
function getDefaultNs(ns) {
|
|
913
|
-
return ns === undefined ? state.initialOptions.defaultNs : ns;
|
|
914
|
-
}
|
|
915
|
-
function getAvailableLanguages() {
|
|
916
|
-
if (state.initialOptions.availableLanguages) {
|
|
917
|
-
return state.initialOptions.availableLanguages;
|
|
918
|
-
}
|
|
919
|
-
else if (state.initialOptions.staticData) {
|
|
920
|
-
const languagesFromStaticData = Object.keys(state.initialOptions.staticData).map((key) => decodeCacheKey(key).language);
|
|
921
|
-
return Array.from(new Set(languagesFromStaticData));
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
function withDefaultNs(descriptor) {
|
|
925
|
-
return {
|
|
926
|
-
namespace: descriptor.namespace === undefined
|
|
927
|
-
? getInitialOptions().defaultNs
|
|
928
|
-
: descriptor.namespace,
|
|
929
|
-
language: descriptor.language,
|
|
930
|
-
};
|
|
931
|
-
}
|
|
932
|
-
function overrideCredentials(credentials) {
|
|
933
|
-
if (credentials) {
|
|
934
|
-
devCredentials = Object.assign(Object.assign({}, credentials), { apiUrl: sanitizeUrl(credentials.apiUrl) });
|
|
935
|
-
}
|
|
936
|
-
else {
|
|
937
|
-
devCredentials = undefined;
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
return Object.freeze({
|
|
941
|
-
init,
|
|
942
|
-
isRunning,
|
|
943
|
-
setRunning,
|
|
944
|
-
isInitialLoading,
|
|
945
|
-
setInitialLoading,
|
|
946
|
-
getLanguage,
|
|
947
|
-
setLanguage,
|
|
948
|
-
getPendingLanguage,
|
|
949
|
-
setPendingLanguage,
|
|
950
|
-
getInitialOptions,
|
|
951
|
-
addActiveNs,
|
|
952
|
-
removeActiveNs,
|
|
953
|
-
getRequiredNamespaces,
|
|
954
|
-
getFallbackLangs,
|
|
955
|
-
getFallbackNs,
|
|
956
|
-
getDefaultNs,
|
|
957
|
-
getAvailableLanguages,
|
|
958
|
-
withDefaultNs,
|
|
959
|
-
overrideCredentials,
|
|
906
|
+
},
|
|
960
907
|
});
|
|
961
|
-
|
|
908
|
+
return self;
|
|
909
|
+
}
|
|
962
910
|
|
|
963
911
|
function parseCombinedOptions(_a) {
|
|
964
912
|
var { ns, noWrap, orEmpty, params, language } = _a, rest = __rest(_a, ["ns", "noWrap", "orEmpty", "params", "language"]);
|
|
@@ -992,10 +940,10 @@
|
|
|
992
940
|
return result;
|
|
993
941
|
};
|
|
994
942
|
|
|
995
|
-
|
|
943
|
+
function Controller({ options }) {
|
|
996
944
|
const events = Events(getFallbackNs, getDefaultNs);
|
|
997
945
|
const fetchingObserver = ValueObserver(false, () => cache.isFetching(), events.onFetchingChange.emit);
|
|
998
|
-
const loadingObserver = ValueObserver(false, () => isLoading(), events.onLoadingChange.emit);
|
|
946
|
+
const loadingObserver = ValueObserver(false, () => self.isLoading(), events.onLoadingChange.emit);
|
|
999
947
|
const state = State(events.onLanguageChange, events.onPendingLanguageChange, events.onRunningChange);
|
|
1000
948
|
const pluginService = Plugins(state.getLanguage, state.getInitialOptions, state.getAvailableLanguages, getTranslationNs, getTranslation, changeTranslation);
|
|
1001
949
|
const cache = Cache(events.onCacheChange, pluginService.getBackendRecord, pluginService.getBackendDevRecord, state.withDefaultNs, state.isInitialLoading, fetchingObserver, loadingObserver);
|
|
@@ -1031,7 +979,7 @@
|
|
|
1031
979
|
const previousValue = cache.getTranslation(keyObject, key);
|
|
1032
980
|
cache.changeTranslation(keyObject, key, value);
|
|
1033
981
|
return {
|
|
1034
|
-
revert
|
|
982
|
+
revert() {
|
|
1035
983
|
cache.changeTranslation(keyObject, key, previousValue);
|
|
1036
984
|
},
|
|
1037
985
|
};
|
|
@@ -1040,20 +988,6 @@
|
|
|
1040
988
|
state.init(options);
|
|
1041
989
|
cache.addStaticData(state.getInitialOptions().staticData);
|
|
1042
990
|
}
|
|
1043
|
-
function isLoading(ns) {
|
|
1044
|
-
return cache.isLoading(state.getLanguage(), ns);
|
|
1045
|
-
}
|
|
1046
|
-
function isDev() {
|
|
1047
|
-
return Boolean(state.getInitialOptions().apiKey && state.getInitialOptions().apiUrl);
|
|
1048
|
-
}
|
|
1049
|
-
async function addActiveNs(ns, forget) {
|
|
1050
|
-
if (!forget) {
|
|
1051
|
-
state.addActiveNs(ns);
|
|
1052
|
-
}
|
|
1053
|
-
if (state.isRunning()) {
|
|
1054
|
-
await loadRequiredRecords(undefined, ns);
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
991
|
function getRequiredRecords(lang, ns) {
|
|
1058
992
|
const languages = state.getFallbackLangs(lang);
|
|
1059
993
|
const namespaces = getRequiredNamespaces(ns);
|
|
@@ -1067,43 +1001,10 @@
|
|
|
1067
1001
|
});
|
|
1068
1002
|
return result;
|
|
1069
1003
|
}
|
|
1070
|
-
function isLoaded(ns) {
|
|
1071
|
-
const language = state.getLanguage();
|
|
1072
|
-
if (!language) {
|
|
1073
|
-
return false;
|
|
1074
|
-
}
|
|
1075
|
-
const languages = state.getFallbackLangs(language);
|
|
1076
|
-
const namespaces = getRequiredNamespaces(ns);
|
|
1077
|
-
const result = [];
|
|
1078
|
-
languages.forEach((language) => {
|
|
1079
|
-
namespaces.forEach((namespace) => {
|
|
1080
|
-
if (!cache.exists({ language, namespace })) {
|
|
1081
|
-
result.push({ language, namespace });
|
|
1082
|
-
}
|
|
1083
|
-
});
|
|
1084
|
-
});
|
|
1085
|
-
return result.length === 0;
|
|
1086
|
-
}
|
|
1087
1004
|
function loadRequiredRecords(lang, ns) {
|
|
1088
1005
|
const descriptors = getRequiredRecords(lang, ns);
|
|
1089
1006
|
if (descriptors.length) {
|
|
1090
|
-
return valueOrPromise(loadRecords(descriptors), () => { });
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
async function changeLanguage(language) {
|
|
1094
|
-
if (state.getPendingLanguage() === language &&
|
|
1095
|
-
state.getLanguage() === language) {
|
|
1096
|
-
return;
|
|
1097
|
-
}
|
|
1098
|
-
state.setPendingLanguage(language);
|
|
1099
|
-
if (state.isRunning()) {
|
|
1100
|
-
await loadRequiredRecords(language);
|
|
1101
|
-
}
|
|
1102
|
-
if (language === state.getPendingLanguage()) {
|
|
1103
|
-
// there might be parallel language change
|
|
1104
|
-
// we only want to apply latest
|
|
1105
|
-
state.setLanguage(language);
|
|
1106
|
-
pluginService.setStoredLanguage(language);
|
|
1007
|
+
return valueOrPromise(self.loadRecords(descriptors), () => { });
|
|
1107
1008
|
}
|
|
1108
1009
|
}
|
|
1109
1010
|
function getTranslationNs({ key, ns }) {
|
|
@@ -1151,13 +1052,7 @@
|
|
|
1151
1052
|
language && state.setLanguage(language);
|
|
1152
1053
|
});
|
|
1153
1054
|
}
|
|
1154
|
-
|
|
1155
|
-
return (await loadRecords([descriptor]))[0];
|
|
1156
|
-
}
|
|
1157
|
-
function loadRecords(descriptors) {
|
|
1158
|
-
return cache.loadRecords(descriptors, isDev());
|
|
1159
|
-
}
|
|
1160
|
-
const checkCorrectConfiguration = () => {
|
|
1055
|
+
function checkCorrectConfiguration() {
|
|
1161
1056
|
const languageComputable = pluginService.getLanguageDetector() || pluginService.getLanguageStorage();
|
|
1162
1057
|
if (languageComputable) {
|
|
1163
1058
|
const availableLanguages = state.getAvailableLanguages();
|
|
@@ -1173,59 +1068,98 @@
|
|
|
1173
1068
|
throw new Error(missingOptionError('language'));
|
|
1174
1069
|
}
|
|
1175
1070
|
}
|
|
1176
|
-
};
|
|
1177
|
-
function run() {
|
|
1178
|
-
let result = undefined;
|
|
1179
|
-
checkCorrectConfiguration();
|
|
1180
|
-
if (!state.isRunning()) {
|
|
1181
|
-
if (isDev()) {
|
|
1182
|
-
cache.invalidate();
|
|
1183
|
-
}
|
|
1184
|
-
state.setRunning(true);
|
|
1185
|
-
pluginService.run();
|
|
1186
|
-
result = loadInitial();
|
|
1187
|
-
}
|
|
1188
|
-
return Promise.resolve(result);
|
|
1189
|
-
}
|
|
1190
|
-
function stop() {
|
|
1191
|
-
if (state.isRunning()) {
|
|
1192
|
-
pluginService.stop();
|
|
1193
|
-
state.setRunning(false);
|
|
1194
|
-
}
|
|
1195
1071
|
}
|
|
1196
|
-
const
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1072
|
+
const self = Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, events), state), pluginService), cache), { init: init, getTranslation: getTranslation, changeTranslation: changeTranslation, async changeLanguage(language) {
|
|
1073
|
+
if (state.getPendingLanguage() === language &&
|
|
1074
|
+
state.getLanguage() === language) {
|
|
1075
|
+
return;
|
|
1076
|
+
}
|
|
1077
|
+
state.setPendingLanguage(language);
|
|
1078
|
+
if (state.isRunning()) {
|
|
1079
|
+
await loadRequiredRecords(language);
|
|
1080
|
+
}
|
|
1081
|
+
if (language === state.getPendingLanguage()) {
|
|
1082
|
+
// there might be parallel language change
|
|
1083
|
+
// we only want to apply latest
|
|
1084
|
+
state.setLanguage(language);
|
|
1085
|
+
pluginService.setStoredLanguage(language);
|
|
1086
|
+
}
|
|
1087
|
+
},
|
|
1088
|
+
async addActiveNs(ns, forget) {
|
|
1089
|
+
if (!forget) {
|
|
1090
|
+
state.addActiveNs(ns);
|
|
1091
|
+
}
|
|
1092
|
+
if (state.isRunning()) {
|
|
1093
|
+
await loadRequiredRecords(undefined, ns);
|
|
1094
|
+
}
|
|
1095
|
+
},
|
|
1096
|
+
loadRecords(descriptors) {
|
|
1097
|
+
return cache.loadRecords(descriptors, self.isDev());
|
|
1098
|
+
},
|
|
1099
|
+
async loadRecord(descriptor) {
|
|
1100
|
+
return (await self.loadRecords([descriptor]))[0];
|
|
1101
|
+
},
|
|
1102
|
+
isLoading(ns) {
|
|
1103
|
+
return cache.isLoading(state.getLanguage(), ns);
|
|
1104
|
+
},
|
|
1105
|
+
isLoaded(ns) {
|
|
1106
|
+
const language = state.getLanguage();
|
|
1107
|
+
if (!language) {
|
|
1108
|
+
return false;
|
|
1109
|
+
}
|
|
1110
|
+
const languages = state.getFallbackLangs(language);
|
|
1111
|
+
const namespaces = getRequiredNamespaces(ns);
|
|
1112
|
+
const result = [];
|
|
1113
|
+
languages.forEach((language) => {
|
|
1114
|
+
namespaces.forEach((namespace) => {
|
|
1115
|
+
if (!cache.exists({ language, namespace })) {
|
|
1116
|
+
result.push({ language, namespace });
|
|
1117
|
+
}
|
|
1118
|
+
});
|
|
1119
|
+
});
|
|
1120
|
+
return result.length === 0;
|
|
1121
|
+
}, t: ((...args) => {
|
|
1122
|
+
// @ts-ignore
|
|
1123
|
+
const params = getTranslateProps(...args);
|
|
1124
|
+
const translation = getTranslation(params);
|
|
1125
|
+
return pluginService.formatTranslation(Object.assign(Object.assign({}, params), { translation }));
|
|
1126
|
+
}), isDev() {
|
|
1127
|
+
return Boolean(state.getInitialOptions().apiKey && state.getInitialOptions().apiUrl);
|
|
1128
|
+
},
|
|
1129
|
+
run() {
|
|
1130
|
+
let result = undefined;
|
|
1131
|
+
checkCorrectConfiguration();
|
|
1132
|
+
if (!state.isRunning()) {
|
|
1133
|
+
if (self.isDev()) {
|
|
1134
|
+
cache.invalidate();
|
|
1135
|
+
}
|
|
1136
|
+
state.setRunning(true);
|
|
1137
|
+
pluginService.run();
|
|
1138
|
+
result = loadInitial();
|
|
1139
|
+
}
|
|
1140
|
+
return Promise.resolve(result);
|
|
1141
|
+
},
|
|
1142
|
+
stop() {
|
|
1143
|
+
if (state.isRunning()) {
|
|
1144
|
+
pluginService.stop();
|
|
1145
|
+
state.setRunning(false);
|
|
1146
|
+
}
|
|
1147
|
+
} }));
|
|
1148
|
+
return self;
|
|
1149
|
+
}
|
|
1216
1150
|
|
|
1217
|
-
|
|
1151
|
+
function createTolgee(options) {
|
|
1218
1152
|
const controller = Controller({
|
|
1219
1153
|
options,
|
|
1220
1154
|
});
|
|
1221
1155
|
// restarts tolgee while applying callback
|
|
1222
|
-
|
|
1156
|
+
function withRestart(callback) {
|
|
1223
1157
|
const wasRunning = controller.isRunning();
|
|
1224
1158
|
wasRunning && controller.stop();
|
|
1225
1159
|
callback();
|
|
1226
1160
|
wasRunning && controller.run();
|
|
1227
|
-
}
|
|
1228
|
-
const
|
|
1161
|
+
}
|
|
1162
|
+
const self = Object.freeze({
|
|
1229
1163
|
/**
|
|
1230
1164
|
* Listen to tolgee events.
|
|
1231
1165
|
*/
|
|
@@ -1376,7 +1310,7 @@
|
|
|
1376
1310
|
*/
|
|
1377
1311
|
addPlugin(plugin) {
|
|
1378
1312
|
if (plugin) {
|
|
1379
|
-
withRestart(() => controller.addPlugin(
|
|
1313
|
+
withRestart(() => controller.addPlugin(self, plugin));
|
|
1380
1314
|
}
|
|
1381
1315
|
},
|
|
1382
1316
|
/**
|
|
@@ -1391,8 +1325,8 @@
|
|
|
1391
1325
|
}
|
|
1392
1326
|
},
|
|
1393
1327
|
});
|
|
1394
|
-
return
|
|
1395
|
-
}
|
|
1328
|
+
return self;
|
|
1329
|
+
}
|
|
1396
1330
|
/**
|
|
1397
1331
|
* Tolgee chainable constructor.
|
|
1398
1332
|
*
|