|
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