UNPKG

@singleton-i18n/angular-client

Version:

Singleton client code for Angular 10.

116 lines 15.3 kB
/* * Copyright 2019-2021 VMware, Inc. * SPDX-License-Identifier: EPL-2.0 */ import { Injectable } from '@angular/core'; import { I18nService } from '../services/i18n.service'; import { VIPServiceConstants } from '../constants'; import { parse } from './plural/plural.message.parser'; export class MessageFormat { constructor(i18nService) { this.i18nService = i18nService; } format(locale, message, args) { this.locale = locale; let isPseudo; const pseudoTag = VIPServiceConstants.PseudoTag, reg = new RegExp(`^(${pseudoTag})(.*?)(${pseudoTag})$`, 'g'); const regResult = reg.exec(message); if (regResult) { message = regResult[2]; isPseudo = true; } const messageAST = parse(message); let result = this.interpret(messageAST, args); result = isPseudo ? pseudoTag + result + pseudoTag : result; return result; } interpret(ast /*: AST */, args) { return this.interpretAST(ast, null, args); } interpretAST(elements, parent, args) { const parts = elements.map((element) => { const res = this.interpretElement(element, parent, args); return res; }); let message = ''; for (let e = 0; e < parts.length; ++e) { message += parts[e]; } return message; } interpretElement(element, parent, args) { if (typeof element === 'string') { return element; } let id = element[0]; const type = element[1]; let res; if (parent && element[0] === '#') { id = parent[0]; const functionNameForNumber = this.getFunctionName('number'); const value = this.getArg(id, args); res = this[functionNameForNumber](value); return res; } const children = {}; if (type === 'plural') { Object.keys(element[2]).forEach((key) => { children[key] = this.interpretAST(element[2][key], element, args); }); element = [element[0], element[1], children]; } const functionName = type ? this.getFunctionName(type) : undefined; if (functionName) { const value = this.getArg(id, args); switch (type) { case 'plural': res = this.interpretPlural(element, value); break; case 'number': res = this.interpretNumber(value); break; } } else if (id && !type) { res = this.getArg(id, args); } return String(res); } interpretPlural(element, value) { const children = element[2]; const type = this.i18nService.getPluralCategory(value, this.locale); const clause = children['=' + +value] || children[type] || children.other; return clause; } interpretNumber(value) { return this.i18nService.formatNumber(value, this.locale); } getFunctionName(type) { const arr = type.split(''); const first = arr.slice(0, 1)[0].toUpperCase(); const h = arr.slice(1).join(''); const str = first + h; const name = 'interpret' + str; return this[name] ? name : undefined; } getArg(id, args) { if (args && (id in args)) { return args[id]; } const parts = id.split('.'); let a = args; for (let i = 0, length = parts.length; a && i < length; ++i) { a = a[parts[i]]; } return a || id; } } MessageFormat.decorators = [ { type: Injectable } ]; MessageFormat.ctorParameters = () => [ { type: I18nService } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcmxpZ2VuZy9Qcm9qZWN0cy9EZXZvcHMvQ2xpZW50X0FuZ3VsYXJfR2l0SHViX05wbWpzL3ZpcC9jaS9wdWIyb3JnL0NsaWVudF9Bbmd1bGFyX0dpdEh1Yl9OcG1qcy9zaW5nbGV0b24vcHJvamVjdHMvYW5ndWxhci1jbGllbnQvIiwic291cmNlcyI6WyJzcmMvZm9ybWF0dGVycy9tZXNzYWdlLmZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSXZELE1BQU0sT0FBTyxhQUFhO0lBRXRCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUksQ0FBQztJQUUxQyxNQUFNLENBQUMsTUFBYyxFQUFFLE9BQWUsRUFBRSxJQUFTO1FBQ3BELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksUUFBaUIsQ0FBQztRQUN0QixNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxTQUFTLEVBQzNDLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLFNBQVMsVUFBVSxTQUFTLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FBa0IsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxJQUFJLFNBQVMsRUFBRTtZQUNYLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUVELE1BQU0sVUFB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QUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUMvQixPQUFRLElBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxFQUFVLEVBQUUsSUFBVTtRQUNqQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQUU7UUFDOUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN6RCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25CLENBQUM7OztZQXZISixVQUFVOzs7WUFORixXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE5LTIwMjEgVk13YXJlLCBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2kxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBWSVBTZXJ2aWNlQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICcuL3BsdXJhbC9wbHVyYWwubWVzc2FnZS5wYXJzZXInO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNZXNzYWdlRm9ybWF0IHtcbiAgICBwcml2YXRlIGxvY2FsZTogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlKSB7IH1cblxuICAgIHB1YmxpYyBmb3JtYXQobG9jYWxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgYXJnczogYW55KSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuXG4gICAgICAgIGxldCBpc1BzZXVkbzogYm9vbGVhbjtcbiAgICAgICAgY29uc3QgcHNldWRvVGFnID0gVklQU2VydmljZUNvbnN0YW50cy5Qc2V1ZG9UYWcsXG4gICAgICAgICAgICByZWcgPSBuZXcgUmVnRXhwKGBeKCR7cHNldWRvVGFnfSkoLio/KSgke3BzZXVkb1RhZ30pJGAsICdnJyk7XG4gICAgICAgIGNvbnN0IHJlZ1Jlc3VsdDogc3RyaW5nW118bnVsbCA9IHJlZy5leGVjKG1lc3NhZ2UpO1xuICAgICAgICBpZiAocmVnUmVzdWx0KSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gcmVnUmVzdWx0WzJdO1xuICAgICAgICAgICAgaXNQc2V1ZG8gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZUFTVCA9IHBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5pbnRlcnByZXQobWVzc2FnZUFTVCwgYXJncyk7XG4gICAgICAgIHJlc3VsdCA9IGlzUHNldWRvID8gcHNldWRvVGFnICsgcmVzdWx0ICsgcHNldWRvVGFnIDogcmVzdWx0O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBpbnRlcnByZXQoXG4gICAgICAgIGFzdDogYW55W10vKjogQVNUICovLFxuICAgICAgICBhcmdzPzogYW55W118e31cbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnByZXRBU1QoYXN0LCBudWxsLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGludGVycHJldEFTVChcbiAgICAgICAgZWxlbWVudHM6IGFueVtdLFxuICAgICAgICBwYXJlbnQ6IGFueSxcbiAgICAgICAgYXJncz86IGFueVtdfHt9XG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuaW50ZXJwcmV0RWxlbWVudChlbGVtZW50LCBwYXJlbnQsIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgcGFydHMubGVuZ3RoOyArK2UpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gcGFydHNbZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnRlcnByZXRFbGVtZW50KGVsZW1lbnQ6IGFueSwgcGFyZW50OiBhbnlbXSwgYXJncz86IGFueVtdfHt9KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlkID0gZWxlbWVudFswXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IGVsZW1lbnRbMV07XG4gICAgICAgIGxldCByZXM7XG5cbiAgICAgICAgaWYgKHBhcmVudCAmJiBlbGVtZW50WzBdID09PSAnIycpIHtcbiAgICAgICAgICAgIGlkID0gcGFyZW50WzBdO1xuICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lRm9yTnVtYmVyID0gdGhpcy5nZXRGdW5jdGlvbk5hbWUoJ251bWJlcicpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEFyZyhpZCwgYXJncyk7XG4gICAgICAgICAgICByZXMgPSAodGhpcyBhcyBhbnkpW2Z1bmN0aW9uTmFtZUZvck51bWJlcl0odmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGlmICh0eXBlID09PSAncGx1cmFsJykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZWxlbWVudFsyXSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5ba2V5XSA9IHRoaXMuaW50ZXJwcmV0QVNUKGVsZW1lbnRbMl1ba2V5XSwgZWxlbWVudCwgYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBbZWxlbWVudFswXSwgZWxlbWVudFsxXSwgY2hpbGRyZW5dO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gdHlwZSA/IHRoaXMuZ2V0RnVuY3Rpb25OYW1lKHR5cGUpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0QXJnKGlkLCBhcmdzKTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3BsdXJhbCc6XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuaW50ZXJwcmV0UGx1cmFsKGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gdGhpcy5pbnRlcnByZXROdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpZCAmJiAhdHlwZSkge1xuICAgICAgICAgICAgcmVzID0gdGhpcy5nZXRBcmcoaWQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAgU3RyaW5nKHJlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnRlcnByZXRQbHVyYWwoZWxlbWVudDogYW55W10sIHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbGVtZW50WzJdO1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5pMThuU2VydmljZS5nZXRQbHVyYWxDYXRlZ29yeSh2YWx1ZSwgdGhpcy5sb2NhbGUpO1xuXG4gICAgICAgIGNvbnN0IGNsYXVzZSA9XG4gICAgICAgICAgICBjaGlsZHJlblsnPScgKyArIHZhbHVlXSB8fFxuICAgICAgICAgICAgY2hpbGRyZW5bdHlwZV0gfHxcbiAgICAgICAgICAgIGNoaWxkcmVuLm90aGVyO1xuICAgICAgICByZXR1cm4gY2xhdXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW50ZXJwcmV0TnVtYmVyKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pMThuU2VydmljZS5mb3JtYXROdW1iZXIodmFsdWUsIHRoaXMubG9jYWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZ1bmN0aW9uTmFtZSh0eXBlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgYXJyID0gdHlwZS5zcGxpdCgnJyk7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gYXJyLnNsaWNlKDAsIDEpWzBdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGggPSBhcnIuc2xpY2UoMSkuam9pbignJyk7XG4gICAgICAgIGNvbnN0IHN0ciA9IGZpcnN0ICsgaDtcbiAgICAgICAgY29uc3QgbmFtZSA9ICdpbnRlcnByZXQnICsgc3RyO1xuICAgICAgICByZXR1cm4gKHRoaXMgYXMgYW55KVtuYW1lXSA/IG5hbWUgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBcmcoaWQ6IHN0cmluZywgYXJncz86IGFueSkge1xuICAgICAgICBpZiAoYXJncyAmJiAoaWQgaW4gYXJncykpIHsgcmV0dXJuIGFyZ3NbaWRdOyB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gaWQuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IGEgPSBhcmdzO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcGFydHMubGVuZ3RoOyBhICYmIGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgYSA9IGFbcGFydHNbaV1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhIHx8IGlkO1xuICAgIH1cblxufVxuXG4iXX0=