diff --git a/src/friendly_errors/fes.js b/src/friendly_errors/fes.js index 883c398969..cf92bad612 100644 --- a/src/friendly_errors/fes.js +++ b/src/friendly_errors/fes.js @@ -4,7 +4,10 @@ import { VERSION } from '../core/constants'; TL.addTranslations(['en', 'en-US', 'en-GB'], enTranslations); const defaultLanguage = navigator.language; -const localTranslation = window.localStorage.getItem(defaultLanguage); +const localStorageAvailable = storageAvailable('localStorage'); +const localTranslation = localStorageAvailable + ? window.localStorage.getItem(`${defaultLanguage}-${VERSION}`) + : null; let translationPromise = new Promise(async resolve => { if (localTranslation) { TL.addTranslations(defaultLanguage, JSON.parse(localTranslation)); @@ -19,7 +22,12 @@ let translationPromise = new Promise(async resolve => { const translation = await translationResponse.json(); TL.addTranslations(defaultLanguage, translation); - window.localStorage.setItem(defaultLanguage, JSON.stringify(translation)); + if (localStorageAvailable) { + window.localStorage.setItem( + `${defaultLanguage}-${VERSION}`, + JSON.stringify(translation) + ); + } } catch { try { // CDN hosted file will be loaded if local is not present @@ -32,10 +40,12 @@ let translationPromise = new Promise(async resolve => { const translation = await translationResponse.json(); TL.addTranslations(defaultLanguage, translation); - window.localStorage.setItem( - defaultLanguage, - JSON.stringify(translation) - ); + if (localStorageAvailable) { + window.localStorage.setItem( + `${defaultLanguage}-${VERSION}`, + JSON.stringify(translation) + ); + } } catch { // If CDN also cannot be reached, do nothing } @@ -142,7 +152,7 @@ export class FES { TL.tl`seventh`, TL.tl`eighth`, TL.tl`ninth`, - TL.tl`tenth`, + TL.tl`tenth` ], types: { string: TL.tl`string`, @@ -233,6 +243,27 @@ function mapToReference(message, func) { return msgWithReference; } +// Feature detect localStorage API is available, from: +// https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API +function storageAvailable(type) { + let storage; + try { + storage = window[type]; + const x = '__storage_test__'; + storage.setItem(x, x); + storage.removeItem(x); + return true; + } catch (e) { + return ( + e instanceof DOMException && + e.name === 'QuotaExceededError' && + // acknowledge QuotaExceededError only if there's something already stored + storage && + storage.length !== 0 + ); + } +} + // Re-export TL export { TL };