Spaces:
Running
Running
import {addLocaleData} from 'react-intl'; | |
import {localeData, isRtl} from '@turbowarp/scratch-l10n'; | |
import editorMessages from '@turbowarp/scratch-l10n/locales/editor-msgs'; | |
import addAdditionalTranslations from '../lib/tw-translations/index.js'; | |
import {LANGUAGE_KEY} from '../lib/detect-locale.js'; | |
addAdditionalTranslations(editorMessages); | |
addLocaleData(localeData); | |
const UPDATE_LOCALES = 'scratch-gui/locales/UPDATE_LOCALES'; | |
const SELECT_LOCALE = 'scratch-gui/locales/SELECT_LOCALE'; | |
const initialState = { | |
isRtl: false, | |
locale: 'en', | |
messagesByLocale: editorMessages, | |
messages: editorMessages.en | |
}; | |
const reducer = function (state, action) { | |
if (typeof state === 'undefined') state = initialState; | |
switch (action.type) { | |
case SELECT_LOCALE: | |
return Object.assign({}, state, { | |
isRtl: isRtl(action.locale), | |
locale: action.locale, | |
messagesByLocale: state.messagesByLocale, | |
messages: state.messagesByLocale[action.locale] | |
}); | |
case UPDATE_LOCALES: | |
return Object.assign({}, state, { | |
isRtl: state.isRtl, | |
locale: state.locale, | |
messagesByLocale: action.messagesByLocale, | |
messages: action.messagesByLocale[state.locale] | |
}); | |
default: | |
return state; | |
} | |
}; | |
const selectLocale = function (locale) { | |
// tw: store language in localStorage | |
try { | |
localStorage.setItem(LANGUAGE_KEY, locale); | |
} catch (e) { /* ignore */ } | |
return { | |
type: SELECT_LOCALE, | |
locale: locale | |
}; | |
}; | |
const setLocales = function (localesMessages) { | |
return { | |
type: UPDATE_LOCALES, | |
messagesByLocale: localesMessages | |
}; | |
}; | |
const initLocale = function (currentState, locale) { | |
if (currentState.messagesByLocale.hasOwnProperty(locale)) { | |
return Object.assign( | |
{}, | |
currentState, | |
{ | |
isRtl: isRtl(locale), | |
locale: locale, | |
messagesByLocale: currentState.messagesByLocale, | |
messages: currentState.messagesByLocale[locale] | |
} | |
); | |
} | |
// don't change locale if it's not in the current messages | |
return currentState; | |
}; | |
export { | |
reducer as default, | |
initialState as localesInitialState, | |
initLocale, | |
selectLocale, | |
setLocales | |
}; | |