UNPKG

nunjucks-translation

Version:
86 lines 3.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TranslationExtension = void 0; var nunjucks_1 = require("nunjucks"); var SafeString = nunjucks_1.runtime.SafeString; var TranslationExtension = (function () { function TranslationExtension(options) { if (options === void 0) { options = { translations: {}, locale: 'en', fallbackLocale: 'en', }; } this.options = options; } Object.defineProperty(TranslationExtension.prototype, "tags", { get: function () { return ['trans']; }, enumerable: false, configurable: true }); TranslationExtension.prototype.parse = function (parser, nodes, lexer) { var tok = parser.nextToken(); var args = parser.parseSignature(null, false); parser.advanceAfterBlockEnd(tok.value); var body = parser.parseUntilBlocks('endtrans'); parser.advanceAfterBlockEnd(); return new nodes.CallExtension(this, 'trans', args, [body]); }; TranslationExtension.prototype.trans = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var context = args.shift(); var locale = args.shift(); var body = args.pop(); var params = args.shift() || {}; var translationId = typeof body === 'function' ? body() : ''; var translatedText = this.translateText(translationId, locale, params); return new SafeString(translatedText); }; TranslationExtension.prototype.translateText = function (textId, locale, params) { locale = this.selectLocale(locale, textId); var translated = this.getPathValue(this.options.translations[locale], textId); if (translated === undefined) { translated = textId; } for (var paramName in params) { var paramValue = typeof params[paramName] === 'string' ? params[paramName] : ''; translated = this.replaceAll(translated, '{' + paramName + '}', paramValue); } return translated; }; TranslationExtension.prototype.escapeRegExp = function (str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; TranslationExtension.prototype.replaceAll = function (str, find, replace) { return str.replace(new RegExp(this.escapeRegExp(find), 'g'), replace); }; TranslationExtension.prototype.translationExistsForLocale = function (locale, textId) { return (this.getPathValue(this.options.translations[locale], textId) !== undefined); }; TranslationExtension.prototype.selectLocale = function (locale, textId) { if (locale && this.translationExistsForLocale(locale, textId)) { return locale; } if (!locale && this.translationExistsForLocale(this.options.locale, textId)) { return this.options.locale; } return this.options.fallbackLocale; }; TranslationExtension.prototype.getPathValue = function (obj, path) { if (!obj) { return undefined; } for (var i = 0, pathArray = path.split('.'), len = pathArray.length; i < len; i++) { obj = obj[pathArray[i]]; } return obj; }; return TranslationExtension; }()); exports.TranslationExtension = TranslationExtension; //# sourceMappingURL=translation.extension.js.map