|
1 | 1 | (function () {
|
2 | 2 |
|
3 |
| - var i18n = new VueI18n({ |
| 3 | + const i18NFetchedURLsKey = `${window.location.pathname}_${eXo.env.portal.language}_${eXo.env.client.assetsVersion}_URLs`; |
| 4 | + const i18NFetchedURLsValue = sessionStorage && sessionStorage.getItem(i18NFetchedURLsKey); |
| 5 | + const i18NFetchedURLs = i18NFetchedURLsValue && JSON.parse(i18NFetchedURLsValue) || []; |
| 6 | + window.eXoI18N = { |
| 7 | + executingFetches: {}, |
| 8 | + i18NFetchedURLs, |
| 9 | + }; |
| 10 | + |
| 11 | + const preloadedMessages = {}; |
| 12 | + window.eXoI18N.i18NFetchedURLs.forEach((url, index) => { |
| 13 | + const cachedMessages = sessionStorage && sessionStorage.getItem(url); |
| 14 | + if (cachedMessages && cachedMessages.length) { |
| 15 | + Object.assign(preloadedMessages, JSON.parse(cachedMessages)); |
| 16 | + } else { |
| 17 | + delete window.eXoI18N.i18NFetchedURLs[index]; |
| 18 | + } |
| 19 | + }); |
| 20 | + window.eXoI18N.i18NFetchedURLs = window.eXoI18N.i18NFetchedURLs.filter(url => !!url); |
| 21 | + |
| 22 | + const i18nMessages = {}; |
| 23 | + i18nMessages[eXo.env.portal.language] = preloadedMessages; |
| 24 | + const i18n = new VueI18n({ |
4 | 25 | locale: eXo.env.portal.language, // set locale
|
5 | 26 | fallbackLocale: 'en',
|
6 |
| - messages: {} |
| 27 | + messages: i18nMessages, |
7 | 28 | });
|
8 | 29 |
|
9 |
| - window.eXoI18N = window.eXoI18N || {}; |
10 |
| - window.eXoI18N.executingFetches = window.eXoI18N.executingFetches || {}; |
11 |
| - window.eXoI18N.i18NFetchedURLs = window.eXoI18N.i18NFetchedURLs || []; |
12 |
| - window.eXoI18N.i18NPreloadedMessages = window.eXoI18N.i18NPreloadedMessages || {}; |
13 |
| - |
14 | 30 | /**
|
15 | 31 | * Load translated strings from the given URLs and for the given language
|
16 | 32 | * @param {string} lang - Language to load strings for
|
17 | 33 | * @param {(string|string[])} urls - Single URL or array of URLs to load i18n files from
|
18 |
| - * @param {string} synchLoading - Whether to fetch I18N in 'sync' (default), 'async' or 'defer' (after page loading) |
19 | 34 | * @returns {Promise} Promise giving the i18n object with loaded translated strings
|
20 | 35 | */
|
21 |
| - function loadLanguageAsync(lang, urls, synchLoading) { |
| 36 | + function loadLanguageAsync(lang, urls) { |
22 | 37 | if (!lang) {
|
23 | 38 | lang = i18n.locale;
|
24 | 39 | }
|
|
29 | 44 |
|
30 | 45 | const promises = [];
|
31 | 46 | urls.forEach(url => {
|
32 |
| - if (synchLoading === 'async') { |
33 |
| - fetchLangFile(url, lang); |
34 |
| - } else if (synchLoading === 'defer') { |
35 |
| - // Load bundles after page loaded event emited |
36 |
| - eXo.env.portal.addOnLoadCallback(() => { |
37 |
| - fetchLangFile(url, lang); |
38 |
| - }); |
39 |
| - } else { // 'sync', default option |
40 |
| - const promise = fetchLangFile(url, lang); |
41 |
| - if (promise) { |
42 |
| - promises.push(promise); |
43 |
| - } |
| 47 | + const promise = fetchLangFile(url, lang); |
| 48 | + if (promise) { |
| 49 | + promises.push(promise); |
44 | 50 | }
|
45 | 51 | });
|
46 | 52 | return Promise.all(promises).then(() => i18n);
|
|
53 | 59 | url = `${url}?v=${eXo.env.client.assetsVersion}`
|
54 | 60 | }
|
55 | 61 |
|
56 |
| - const msgs = window.eXoI18N.i18NPreloadedMessages[url]; |
57 |
| - if (msgs) { |
58 |
| - delete window.eXoI18N.i18NPreloadedMessages[url]; |
59 |
| - i18n.mergeLocaleMessage(lang, msgs); |
60 |
| - return Promise.resolve(i18n); |
61 |
| - } else if (window.eXoI18N.i18NFetchedURLs.indexOf(url) >= 0) { |
| 62 | + if (window.eXoI18N.executingFetches[url]) { |
62 | 63 | return window.eXoI18N.executingFetches[url];
|
| 64 | + } else if (window.eXoI18N.i18NFetchedURLs.indexOf(url) >= 0) { |
| 65 | + return Promise.resolve(i18n); |
63 | 66 | } else {
|
64 |
| - const i18NFetch = fetch(url) |
65 |
| - .then(resp => resp && resp.ok && resp.json()) |
66 |
| - .then(msgs => { |
67 |
| - if (msgs) { |
68 |
| - i18n.mergeLocaleMessage(lang, msgs); |
69 |
| - i18n.locale = lang; |
| 67 | + const cachedMessages = sessionStorage && sessionStorage.getItem(url); |
| 68 | + const i18NFetch = (cachedMessages && Promise.resolve(JSON.parse(cachedMessages)) || fetch(url).then(resp => resp && resp.ok && resp.json())); |
| 69 | + window.eXoI18N.executingFetches[url] = i18NFetch; |
| 70 | + return i18NFetch |
| 71 | + .then(data => { |
| 72 | + if (data) { |
| 73 | + i18n.mergeLocaleMessage(lang, data); |
| 74 | + if (!cachedMessages) { |
| 75 | + try { |
| 76 | + sessionStorage.setItem(url, JSON.stringify(data)); |
| 77 | + } catch (e) { |
| 78 | + // QuotaExceededError can be thrown, thus nothing to do here |
| 79 | + } |
| 80 | + } |
70 | 81 | }
|
71 | 82 | return i18n;
|
72 | 83 | })
|
73 |
| - .finally(() => delete window.eXoI18N.executingFetches[url]); |
74 |
| - window.eXoI18N.executingFetches[url] = i18NFetch; |
75 |
| - window.eXoI18N.i18NFetchedURLs.push(url); |
76 |
| - return i18NFetch; |
| 84 | + .finally(() => { |
| 85 | + delete window.eXoI18N.executingFetches[url]; |
| 86 | + window.eXoI18N.i18NFetchedURLs.push(url); |
| 87 | + try { |
| 88 | + sessionStorage.setItem(i18NFetchedURLsKey, JSON.stringify(window.eXoI18N.i18NFetchedURLs)); |
| 89 | + } catch (e) { |
| 90 | + // QuotaExceededError can be thrown, thus nothing to do here |
| 91 | + } |
| 92 | + return i18n; |
| 93 | + }); |
77 | 94 | }
|
78 | 95 | }
|
79 | 96 |
|
|
0 commit comments