UNPKG

plural-rules

Version:

Evaluates plural rules, so that localization libraries can choose the right plural form.

104 lines (99 loc) 2.91 kB
'use strict'; var parsePluralRule = require('cldrpluralruleparser'); function parsePluralForms (serializedForms) { return serializedForms .split(',') .reduce((result, serializedForm) => { const parts = serializedForm.split(':'); result[parts[0]] = +parts[1]; return result }, {}) } function indexPluralForms (forms, rules) { return Object .keys(forms) .reduce((result, formName) => { let rule = forms[formName]; if (typeof rule === 'string') { rule = rule .trim() .replace(/ {2}/g, ' '); let ruleIndex = rules.indexOf(rule); if (ruleIndex < 0) { ruleIndex = rules.length; rules.push(rule); } rule = ruleIndex; } if (formName.length > 17) { formName = formName.substr(17); } result[formName] = rule; return result }, {}) } let rules = []; let cardinals = {}; function normalizeLocale (locale) { return locale.toLowerCase().replace('_', '-') } function getLanguage (locale) { const separator = locale.indexOf('-'); return separator > 0 && locale.substr(0, separator) } function getPluralRulesForCardinals (locale) { locale = normalizeLocale(locale); let forms = cardinals[locale]; let language; if (forms === undefined) { language = getLanguage(locale); if (language) { forms = cardinals[language]; } } if (forms === undefined) { throw new Error(`Unrecognised locale: "${locale}".`) } else if (typeof forms === 'string') { forms = parsePluralForms(forms); cardinals[language || locale] = forms; } return forms } function getPluralFormForCardinal (locale, count) { const forms = typeof locale !== 'string' ? locale : getPluralRulesForCardinals(locale); for (const form in forms) { const rule = forms[form]; if (parsePluralRule(rules[rule], count)) { return form } } } function setPluralFormsForCardinals (locale, forms) { locale = normalizeLocale(locale); cardinals[locale] = indexPluralForms(forms, rules); } function populatePluralData (data) { rules = data.rules; cardinals = data.cardinals; } let supportedLocales; function getSupportedLocales() { if (!supportedLocales) supportedLocales = Object.keys(cardinals); return supportedLocales } function getPluralFormsForLocale(locale) { const cardinal = cardinals[locale]; if (cardinal === undefined) return return cardinal .split(',') .map(form => form.substring(0, form.indexOf(':'))) } exports.getPluralFormForCardinal = getPluralFormForCardinal; exports.getPluralFormsForLocale = getPluralFormsForLocale; exports.getPluralRulesForCardinals = getPluralRulesForCardinals; exports.getSupportedLocales = getSupportedLocales; exports.populatePluralData = populatePluralData; exports.setPluralFormsForCardinals = setPluralFormsForCardinals; //# sourceMappingURL=code.cjs.map