UNPKG

@ngneat/transloco

Version:

The internationalization (i18n) library for Angular

241 lines 18.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/transloco.transpiler.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Inject, Injectable, InjectionToken, Injector, Optional } from '@angular/core'; import { getValue, isDefined, isObject, isString, setValue } from './helpers'; import { defaultConfig, TRANSLOCO_CONFIG } from './transloco.config'; /** @type {?} */ export const TRANSLOCO_TRANSPILER = new InjectionToken('TRANSLOCO_TRANSPILER'); /** * @record */ export function TranslocoTranspiler() { } if (false) { /** * @param {?} value * @param {?} params * @param {?} translation * @return {?} */ TranslocoTranspiler.prototype.transpile = function (value, params, translation) { }; /** * @param {?} lang * @return {?} */ TranslocoTranspiler.prototype.onLangChanged = function (lang) { }; } export class DefaultTranspiler { /** * @param {?=} userConfig */ constructor(userConfig) { this.interpolationMatcher = resolveMatcher(userConfig); } /** * @param {?} value * @param {?=} params * @param {?=} translation * @return {?} */ transpile(value, params = {}, translation) { if (isString(value)) { return value.replace(this.interpolationMatcher, (/** * @param {?} _ * @param {?} match * @return {?} */ (_, match) => { match = match.trim(); if (isDefined(params[match])) { return params[match]; } return isDefined(translation[match]) ? this.transpile(translation[match], params, translation) : ''; })); } else if (params) { if (isObject(value)) { value = this.handleObject(value, params, translation); } else if (Array.isArray(value)) { value = this.handleArray(value, params, translation); } } return value; } /** * * \@example * * const en = { * a: { * b: { * c: "Hello {{ value }}" * } * } * } * * const params = { * "b.c": { value: "Transloco "} * } * * service.selectTranslate('a', params); * * // the first param will be the result of `en.a`. * // the second param will be `params`. * parser.transpile(value, params, {}); * * * @protected * @param {?} value * @param {?=} params * @param {?=} translation * @return {?} */ handleObject(value, params = {}, translation) { /** @type {?} */ let result = value; Object.keys(params).forEach((/** * @param {?} p * @return {?} */ p => { // get the value of "b.c" inside "a" => "Hello {{ value }}" /** @type {?} */ const v = getValue(result, p); // get the params of "b.c" => { value: "Transloco" } /** @type {?} */ const getParams = getValue(params, p); // transpile the value => "Hello Transloco" /** @type {?} */ const transpiled = this.transpile(v, getParams, translation); // set "b.c" to `transpiled` result = setValue(result, p, transpiled); })); return result; } /** * @protected * @param {?} value * @param {?=} params * @param {?=} translation * @return {?} */ handleArray(value, params = {}, translation) { return value.map((/** * @param {?} v * @return {?} */ v => this.transpile(v, params, translation))); } } /** @nocollapse */ DefaultTranspiler.ctorParameters = () => [ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [TRANSLOCO_CONFIG,] }] } ]; if (false) { /** * @type {?} * @protected */ DefaultTranspiler.prototype.interpolationMatcher; } /** * @param {?=} userConfig * @return {?} */ function resolveMatcher(userConfig) { const [start, end] = userConfig && userConfig.interpolation ? userConfig.interpolation : defaultConfig.interpolation; return new RegExp(`${start}(.*?)${end}`, 'g'); } /** * @record */ export function TranslocoTranspilerFunction() { } if (false) { /** * @param {...?} args * @return {?} */ TranslocoTranspilerFunction.prototype.transpile = function (args) { }; } /** * @param {?} argsString * @return {?} */ export function getFunctionArgs(argsString) { /** @type {?} */ const splitted = argsString ? argsString.split(',') : []; /** @type {?} */ const args = []; for (let i = 0; i < splitted.length; i++) { /** @type {?} */ let value = splitted[i].trim(); while (value[value.length - 1] === '\\') { i++; value = value.replace('\\', ',') + splitted[i]; } args.push(value); } return args; } export class FunctionalTranspiler extends DefaultTranspiler { /** * @param {?} injector */ constructor(injector) { super(); this.injector = injector; } /** * @param {?} value * @param {?=} params * @param {?=} translation * @return {?} */ transpile(value, params = {}, translation) { /** @type {?} */ let transpiled = value; if (isString(value)) { transpiled = value.replace(/\[\[\s*(\w+)\((.*)\)\s*]]/g, (/** * @param {?} match * @param {?} functionName * @param {?} args * @return {?} */ (match, functionName, args) => { try { /** @type {?} */ const func = this.injector.get(functionName); return func.transpile(...getFunctionArgs(args)); } catch (e) { /** @type {?} */ let message = `There is an error in: '${value}'. Check that the you used the right syntax in your translation and that the implementation of ${functionName} is correct.`; if (e.message.includes('NullInjectorError')) { message = `You are using the '${functionName}' function in your translation but no provider was found!`; } throw new Error(message); } })); } return super.transpile(transpiled, params, translation); } } FunctionalTranspiler.decorators = [ { type: Injectable } ]; /** @nocollapse */ FunctionalTranspiler.ctorParameters = () => [ { type: Injector } ]; if (false) { /** * @type {?} * @private */ FunctionalTranspiler.prototype.injector; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnRyYW5zcGlsZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmduZWF0L3RyYW5zbG9jby8iLCJzb3VyY2VzIjpbImxpYi90cmFuc2xvY28udHJhbnNwaWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0sb0JBQW9CLENBQUM7O0FBRXRGLE1BQU0sT0FBTyxvQkFBb0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQzs7OztBQUU5RSx5Q0FJQzs7Ozs7Ozs7SUFIQyxvRkFBa0U7Ozs7O0lBRWxFLGtFQUFtQzs7QUFHckMsTUFBTSxPQUFPLGlCQUFpQjs7OztJQUc1QixZQUFrRCxVQUE0QjtRQUM1RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Ozs7Ozs7SUFFRCxTQUFTLENBQUMsS0FBVSxFQUFFLFNBQWtCLEVBQUUsRUFBRSxXQUF3QjtRQUNsRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQjs7Ozs7WUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDM0QsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQzVCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN0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Q0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFELENBQUM7OztZQTFCRixVQUFVOzs7O1lBbEhrQyxRQUFROzs7Ozs7O0lBb0h2Qyx3Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3RvciwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhhc2hNYXAsIFRyYW5zbGF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRWYWx1ZSwgaXNEZWZpbmVkLCBpc09iamVjdCwgaXNTdHJpbmcsIHNldFZhbHVlIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGRlZmF1bHRDb25maWcsIFRSQU5TTE9DT19DT05GSUcsIFRyYW5zbG9jb0NvbmZpZyB9IGZyb20gJy4vdHJhbnNsb2NvLmNvbmZpZyc7XG5cbmV4cG9ydCBjb25zdCBUUkFOU0xPQ09fVFJBTlNQSUxFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignVFJBTlNMT0NPX1RSQU5TUElMRVInKTtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xvY29UcmFuc3BpbGVyIHtcbiAgdHJhbnNwaWxlKHZhbHVlOiBhbnksIHBhcmFtczogSGFzaE1hcCwgdHJhbnNsYXRpb246IEhhc2hNYXApOiBhbnk7XG5cbiAgb25MYW5nQ2hhbmdlZD8obGFuZzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRUcmFuc3BpbGVyIGltcGxlbWVudHMgVHJhbnNsb2NvVHJhbnNwaWxlciB7XG4gIHByb3RlY3RlZCBpbnRlcnBvbGF0aW9uTWF0Y2hlcjogUmVnRXhwO1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoVFJBTlNMT0NPX0NPTkZJRykgdXNlckNvbmZpZz86IFRyYW5zbG9jb0NvbmZpZykge1xuICAgIHRoaXMuaW50ZXJwb2xhdGlvbk1hdGNoZXIgPSByZXNvbHZlTWF0Y2hlcih1c2VyQ29uZmlnKTtcbiAgfVxuXG4gIHRyYW5zcGlsZSh2YWx1ZTogYW55LCBwYXJhbXM6IEhhc2hNYXAgPSB7fSwgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uKTogYW55IHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSh0aGlzLmludGVycG9sYXRpb25NYXRjaGVyLCAoXywgbWF0Y2gpID0+IHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC50cmltKCk7XG4gICAgICAgIGlmIChpc0RlZmluZWQocGFyYW1zW21hdGNoXSkpIHtcbiAgICAgICAgICByZXR1cm4gcGFyYW1zW21hdGNoXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0RlZmluZWQodHJhbnNsYXRpb25bbWF0Y2hdKSA/IHRoaXMudHJhbnNwaWxlKHRyYW5zbGF0aW9uW21hdGNoXSwgcGFyYW1zLCB0cmFuc2xhdGlvbikgOiAnJztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zKSB7XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5oYW5kbGVPYmplY3QodmFsdWUsIHBhcmFtcywgdHJhbnNsYXRpb24pO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuaGFuZGxlQXJyYXkodmFsdWUsIHBhcmFtcywgdHJhbnNsYXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBjb25zdCBlbiA9IHtcbiAgICogIGE6IHtcbiAgICogICAgYjoge1xuICAgKiAgICAgIGM6IFwiSGVsbG8ge3sgdmFsdWUgfX1cIlxuICAgKiAgICB9XG4gICAqICB9XG4gICAqIH1cbiAgICpcbiAgICogY29uc3QgcGFyYW1zID0gIHtcbiAgICogIFwiYi5jXCI6IHsgdmFsdWU6IFwiVHJhbnNsb2NvIFwifVxuICAgKiB9XG4gICAqXG4gICAqIHNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlKCdhJywgcGFyYW1zKTtcbiAgICpcbiAgICogLy8gdGhlIGZpcnN0IHBhcmFtIHdpbGwgYmUgdGhlIHJlc3VsdCBvZiBgZW4uYWAuXG4gICAqIC8vIHRoZSBzZWNvbmQgcGFyYW0gd2lsbCBiZSBgcGFyYW1zYC5cbiAgICogcGFyc2VyLnRyYW5zcGlsZSh2YWx1ZSwgcGFyYW1zLCB7fSk7XG4gICAqXG4gICAqXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlT2JqZWN0KHZhbHVlOiBhbnksIHBhcmFtczogSGFzaE1hcCA9IHt9LCB0cmFuc2xhdGlvbjogVHJhbnNsYXRpb24pIHtcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWU7XG5cbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2gocCA9PiB7XG4gICAgICAvLyBnZXQgdGhlIHZhbHVlIG9mIFwiYi5jXCIgaW5zaWRlIFwiYVwiID0+IFwiSGVsbG8ge3sgdmFsdWUgfX1cIlxuICAgICAgY29uc3QgdiA9IGdldFZhbHVlKHJlc3VsdCwgcCk7XG4gICAgICAvLyBnZXQgdGhlIHBhcmFtcyBvZiBcImIuY1wiID0+IHsgdmFsdWU6IFwiVHJhbnNsb2NvXCIgfVxuICAgICAgY29uc3QgZ2V0UGFyYW1zID0gZ2V0VmFsdWUocGFyYW1zLCBwKTtcblxuICAgICAgLy8gdHJhbnNwaWxlIHRoZSB2YWx1ZSA9PiBcIkhlbGxvIFRyYW5zbG9jb1wiXG4gICAgICBjb25zdCB0cmFuc3BpbGVkID0gdGhpcy50cmFuc3BpbGUodiwgZ2V0UGFyYW1zLCB0cmFuc2xhdGlvbik7XG5cbiAgICAgIC8vIHNldCBcImIuY1wiIHRvIGB0cmFuc3BpbGVkYFxuICAgICAgcmVzdWx0ID0gc2V0VmFsdWUocmVzdWx0LCBwLCB0cmFuc3BpbGVkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlQXJyYXkodmFsdWU6IHN0cmluZ1tdLCBwYXJhbXM6IEhhc2hNYXAgPSB7fSwgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IHRoaXMudHJhbnNwaWxlKHYsIHBhcmFtcywgdHJhbnNsYXRpb24pKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTWF0Y2hlcih1c2VyQ29uZmlnPzogVHJhbnNsb2NvQ29uZmlnKTogUmVnRXhwIHtcbiAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdXNlckNvbmZpZyAmJiB1c2VyQ29uZmlnLmludGVycG9sYXRpb24gPyB1c2VyQ29uZmlnLmludGVycG9sYXRpb24gOiBkZWZhdWx0Q29uZmlnLmludGVycG9sYXRpb247XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAoYCR7c3RhcnR9KC4qPykke2VuZH1gLCAnZycpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbG9jb1RyYW5zcGlsZXJGdW5jdGlvbiB7XG4gIHRyYW5zcGlsZSguLi5hcmdzOiBzdHJpbmdbXSk6IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhhcmdzU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwbGl0dGVkID0gYXJnc1N0cmluZyA/IGFyZ3NTdHJpbmcuc3BsaXQoJywnKSA6IFtdO1xuICBjb25zdCBhcmdzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgdmFsdWUgPSBzcGxpdHRlZFtpXS50cmltKCk7XG4gICAgd2hpbGUgKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgIGkrKztcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXCcsICcsJykgKyBzcGxpdHRlZFtpXTtcbiAgICB9XG4gICAgYXJncy5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25hbFRyYW5zcGlsZXIgZXh0ZW5kcyBEZWZhdWx0VHJhbnNwaWxlciBpbXBsZW1lbnRzIFRyYW5zbG9jb1RyYW5zcGlsZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICB0cmFuc3BpbGUodmFsdWU6IGFueSwgcGFyYW1zOiBIYXNoTWFwID0ge30sIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbik6IGFueSB7XG4gICAgbGV0IHRyYW5zcGlsZWQgPSB2YWx1ZTtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICB0cmFuc3BpbGVkID0gdmFsdWUucmVwbGFjZSgvXFxbXFxbXFxzKihcXHcrKVxcKCguKilcXClcXHMqXV0vZywgKG1hdGNoOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBhcmdzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmdW5jOiBUcmFuc2xvY29UcmFuc3BpbGVyRnVuY3Rpb24gPSB0aGlzLmluamVjdG9yLmdldChmdW5jdGlvbk5hbWUpO1xuXG4gICAgICAgICAgcmV0dXJuIGZ1bmMudHJhbnNwaWxlKC4uLmdldEZ1bmN0aW9uQXJncyhhcmdzKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBUaGVyZSBpcyBhbiBlcnJvciBpbjogJyR7dmFsdWV9Jy4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoYXQgdGhlIHlvdSB1c2VkIHRoZSByaWdodCBzeW50YXggaW4geW91ciB0cmFuc2xhdGlvbiBhbmQgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2YgJHtmdW5jdGlvbk5hbWV9IGlzIGNvcnJlY3QuYDtcbiAgICAgICAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKCdOdWxsSW5qZWN0b3JFcnJvcicpKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYFlvdSBhcmUgdXNpbmcgdGhlICcke2Z1bmN0aW9uTmFtZX0nIGZ1bmN0aW9uIGluIHlvdXIgdHJhbnNsYXRpb24gYnV0IG5vIHByb3ZpZGVyIHdhcyBmb3VuZCFgO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci50cmFuc3BpbGUodHJhbnNwaWxlZCwgcGFyYW1zLCB0cmFuc2xhdGlvbik7XG4gIH1cbn1cbiJdfQ==