UNPKG

templural

Version:

Template function for plural-sensitive formatting

58 lines 2.37 kB
"use strict"; 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