templural
Version:
Template function for plural-sensitive formatting
58 lines • 2.37 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.forLocales = exports.templural = void 0;
const categories_1 = require("./categories");
const locales_1 = require("./locales");
const parse_1 = require("./parse");
const template_1 = require("./template");
exports.templural = forLocales();
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_1.Template.fromParsedTemplate((0, parse_1.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({}, locales_1.defaultLocalesOptions[resolvedOptions.locale], options);
categoriesConfiguration = {
categories: resolvedOptions.pluralCategories,
categoryOrders: (0, categories_1.resolveCategoryOrders)(resolvedOptions.pluralCategories, optionsWDefault),
categoryFallback: (_a = optionsWDefault.categoryFallback) !== null && _a !== void 0 ? _a : {},
};
templateCache.clear();
return templural;
};
return templural.setLocales(locales, options);
}
exports.forLocales = forLocales;
function resolve(template, args, pluralRules) {
return template.map(item => {
var _a;
if (template_1.Template.isChunk(item))
return item;
if (template_1.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