UNPKG

piral-translate

Version:

Plugin for providing translated messages in Piral.

71 lines 2.83 kB
import * as deepmerge from 'deepmerge'; import { createActions } from './actions'; import { Localizer } from './localize'; import { DefaultPicker } from './default'; import { flattenTranslations } from './flatten-translations'; /** * Sets up a new localizer by using the given config. * @param config The configuration for the new localizer. */ export function setupLocalizer(config = {}) { const msgs = config.messages || {}; const languages = Object.keys(msgs); const defaultLang = languages[0] || 'en'; const computeLang = config.language; const usedLang = typeof computeLang === 'function' ? computeLang(languages, defaultLang, 'en') : computeLang; const language = usedLang || defaultLang; return new Localizer(msgs, language, languages.length ? languages : [language], config.fallback); } /** * Creates new Pilet API extensions for localization. * @param localizer The specific localizer to be used, if any. */ export function createLocaleApi(localizer = setupLocalizer()) { return (context) => { context.defineActions(createActions(localizer)); context.dispatch((state) => ({ ...state, components: { LanguagesPicker: DefaultPicker, ...state.components, }, language: { loading: false, available: localizer.languages, selected: localizer.language, }, })); return (api) => { let localTranslations = {}; const setTranslations = (messages) => { localTranslations = flattenTranslations(messages); }; return { addTranslations(messages, isOverriding = true) { const current = localizer.messages; setTranslations(deepmerge.all(isOverriding ? [current, ...messages] : [...messages, current])); }, getCurrentLanguage(cb) { const selected = context.readState((s) => s.language.selected); if (cb) { cb(selected); const handler = (ev) => { cb(ev.currentLanguage); }; api.on('select-language', handler); return () => api.off('select-language', handler); } return selected; }, setTranslations, getTranslations() { return localTranslations; }, translate(tag, variables) { return localizer.localizeLocal(localTranslations, tag, variables); }, }; }; }; } //# sourceMappingURL=create.js.map