ember-intl
Version:
A internationalization toolbox for ambitious applications.
80 lines (65 loc) • 2.21 kB
JavaScript
const messageParser = require('intl-messageformat-parser');
const pluralCategories = require('./plural-categories');
const ordinalCategories = require('./ordinal-categories');
const traverse = require('./ast-traverse');
const parseOptions = require('../parse-options');
const { TYPE } = messageParser;
function validateMessage(message, locale) {
const ast = messageParser.parse(message, parseOptions);
const language = locale.split('-')[0];
const validPlurals = pluralCategories[language];
const validOrdinals = ordinalCategories[language];
traverse(ast, {
[TYPE.plural]: (node) => {
const selectors = Object.keys(node.options).map((s) => s.trim());
if (!selectors.includes('other')) {
throw new MissingOtherSelectorError();
}
if (!locale) {
return;
}
const isOrdinal = node.pluralType === 'ordinal';
const validSelectors = isOrdinal ? validOrdinals : validPlurals;
const invalidSelectors = selectors.filter((selector) => {
return validSelectors.indexOf(selector) === -1 && !/=\d+/.test(selector);
});
if (invalidSelectors.length) {
if (isOrdinal) {
throw new UnknownOrdinalCategoriesError(invalidSelectors);
} else {
throw new UnknownPluralCategoriesError(invalidSelectors);
}
}
},
[TYPE.select]: (node) => {
const selectors = Object.keys(node.options).map((s) => s.trim());
if (!selectors.includes('other')) {
throw new MissingOtherSelectorError();
}
},
});
}
class UnknownPluralCategoriesError extends Error {
constructor(categories) {
super(
categories.length === 1
? `Unknown plural category: ${categories[0]}`
: `Unknown plural categories: ${categories.join(', ')}`
);
}
}
class UnknownOrdinalCategoriesError extends Error {
constructor(categories) {
super(
categories.length === 1
? `Unknown ordinal category: ${categories[0]}`
: `Unknown ordinal categories: ${categories.join(', ')}`
);
}
}
class MissingOtherSelectorError extends Error {
constructor() {
super('Missing selector: other');
}
}
module.exports = validateMessage;