nunjucks-translation
Version:
Nunjucks Extension and Filter for Translation
86 lines • 3.49 kB
JavaScript
;
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