templural
Version:
Template function for plural-sensitive formatting
54 lines • 2.17 kB
JavaScript
import { resolveCategoryOrders } from './categories';
import { defaultLocalesOptions } from './locales';
import { parseChunks } from './parse';
import { Template } from './template';
export const templural = forLocales();
export function forLocales(locales, options) {
function templural(chunks, ...args) {
let template;
const key = chunksToKey(chunks);
if (templateCache.has(key)) {
template = templateCache.get(key);
}
else {
templateCache.set(key, template = Template.fromParsedTemplate(parseChunks(chunks), categoriesConfiguration));
}
return resolve(template, args, pluralRules);
}
let pluralRules;
let categoriesConfiguration;
const templateCache = new Map();
templural.setLocales = function setLocales(locales, options) {
var _a;
pluralRules = new Intl.PluralRules(locales);
const resolvedOptions = pluralRules.resolvedOptions();
const optionsWDefault = Object.assign({}, defaultLocalesOptions[resolvedOptions.locale], options);
categoriesConfiguration = {
categories: resolvedOptions.pluralCategories,
categoryOrders: resolveCategoryOrders(resolvedOptions.pluralCategories, optionsWDefault),
categoryFallback: (_a = optionsWDefault.categoryFallback) !== null && _a !== void 0 ? _a : {},
};
templateCache.clear();
return templural;
};
return templural.setLocales(locales, options);
}
function resolve(template, args, pluralRules) {
return template.map(item => {
var _a;
if (Template.isChunk(item))
return item;
if (Template.isArg(item))
return toString(args[item]);
if (!(item.argIndex in args))
return '';
return (_a = item.categoryToResult[pluralRules.select(args[item.argIndex])]) !== null && _a !== void 0 ? _a : '';
}).join('');
}
function toString(v) {
return v == null ? '' : v.toString(); // FIXME not sure
}
function chunksToKey(chunks) {
return chunks.raw.reduce((acc, chunk, i) => `${acc}\${${i}}${chunk}`);
}
//# sourceMappingURL=index.js.map