piral-translate
Version:
Plugin for providing translated messages in Piral.
71 lines • 2.83 kB
JavaScript
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