plural-rules
Version:
Evaluates plural rules, so that localization libraries can choose the right plural form.
104 lines (99 loc) • 2.91 kB
JavaScript
;
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