UNPKG

@tabuckner/doggo-translator-ts

Version:

A typescript doggo translator based on DoggoTranslatorCore

154 lines 6.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var translation_tokens_enum_1 = require("../i18n/tokens/translation-tokens.enum"); var i18n_1 = require("../i18n"); var locale_loader_service_1 = require("../i18n/locale-loader.service"); var error_service_1 = require("../util/error.service"); // Import here Polyfills if needed. Recommended core-js (npm i -D core-js) // import "core-js/fn/array.find" /** * Given a language.json object, returns an instance of `DoggoTranslator`. */ var DoggoTranslator = /** @class */ (function () { function DoggoTranslator(config) { this.defaultResponse = 'Bork'; this.defaultLanguage = translation_tokens_enum_1.LANGUAGE_TOKENS_ENUM.english; this.localeLoaderService = new locale_loader_service_1.LocaleLoaderService(); this.configValidation(config); this.setUpTranslator(config); } /** * * @param sourceSentence Sentence in the sourceLanguage * @param reverse boolean to control direction of translation (e.g. true = sourceLanguage => doggo, false = doggo => sourceLanguage) */ DoggoTranslator.prototype.translateSentence = function (sourceSentence, reverse) { if (reverse === void 0) { reverse = false; } if (sourceSentence === '') { return this.defaultResponse; } var translationsMap = this.localeLoaderService.getTranslationsMap(); var words = translationsMap.words; var suffixes = translationsMap.suffixes; sourceSentence = this.replaceWholeWords(words, reverse, sourceSentence); if (suffixes) { sourceSentence = this.replaceSuffixes(suffixes, reverse, sourceSentence); } return sourceSentence; }; /** * Returns available languages. */ DoggoTranslator.prototype.getAllLanguageTokens = function () { return i18n_1.TokensService.getAllLanguageTokens(); }; /** * Given a language token, will attempt to set the current language. * @param languageToken the language token */ DoggoTranslator.prototype.setLanguage = function (languageToken) { if (!this.languageAvailable(languageToken)) { error_service_1.ErrorService.logError("The language was not found, defaulting to " + this.defaultLanguage); this.languageToken = this.defaultLanguage; return this.localeLoaderService.loadLibraryTranslations(languageToken); } this.languageToken = languageToken; return this.localeLoaderService.loadLibraryTranslations(languageToken); }; DoggoTranslator.prototype.configValidation = function (config) { if (!config || (!config.languageToken && !config.userTranslationsMap)) { error_service_1.ErrorService.throw('Invalid Config Provided. You must provide at least one of the following: \n\t`languageToken` or `userTranslationsMap`'); } }; DoggoTranslator.prototype.setUpTranslator = function (config) { if (!config.userTranslationsMap) { return this.setLanguage(config.languageToken); } this.setLanguage(translation_tokens_enum_1.LANGUAGE_TOKENS_ENUM.userDefined); return this.localeLoaderService.setTranslationsMap(config.userTranslationsMap); }; /** * Given a language token, will return whether the language is available. * @param language language token */ DoggoTranslator.prototype.languageAvailable = function (languageToken) { return i18n_1.TokensService.languageAvailable(languageToken); }; DoggoTranslator.prototype.replaceWholeWords = function (words, reverse, sourceSentence) { for (var key in words) { if (words.hasOwnProperty(key)) { var value = words[key]; if (!reverse) { sourceSentence = this.translateWholeWord(sourceSentence, key, value); } else { sourceSentence = this.translateWholeWord(sourceSentence, value, key); } } } return sourceSentence; }; DoggoTranslator.prototype.replaceSuffixes = function (suffixes, reverse, sourceSentence) { for (var key in suffixes) { if (suffixes.hasOwnProperty(key)) { var value = suffixes[key]; if (!reverse) { sourceSentence = this.transformSuffixes(sourceSentence, key, value); } else { sourceSentence = this.transformSuffixes(sourceSentence, value, key); } } } return sourceSentence; }; /** * Replaces a part from the input and tries to format it with the proper case. * @param input The complete input * @param find The word or sentence to find * @param replace The word or sentence to replace the found word or sentence */ DoggoTranslator.prototype.translateWholeWord = function (input, regex, replace) { var _this = this; regex = this.escapeRegex(regex); return input.replace(new RegExp('\\b(' + regex + ')\\b', 'gi'), function (match) { if (match === match.toUpperCase()) { return replace.toUpperCase(); } if (match === _this.capitalizeFirstCharacter(match)) { return _this.capitalizeFirstCharacter(replace); } return replace; }); }; DoggoTranslator.prototype.transformSuffixes = function (input, regex, replace) { regex = this.escapeRegex(regex); return input.replace(new RegExp('(' + regex + ')\\b', 'gi'), function (match) { if (match === match.toUpperCase()) { return replace.toUpperCase(); } // TODO: Add support for respecting character capitalization. return replace; }); }; /** * Returns a string with the first character capitalized. * @param target The string to format */ DoggoTranslator.prototype.capitalizeFirstCharacter = function (target) { var firstCharacterCapitalized = target.charAt(0).toUpperCase(); var restOfTheWord = target.slice(1); return "" + firstCharacterCapitalized + restOfTheWord; }; /** * Given a string, returns the string with all special characters escaped so that the translation * regex see them as special characters. * @param target The string to escape */ DoggoTranslator.prototype.escapeRegex = function (target) { return target.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); }; return DoggoTranslator; }()); exports.DoggoTranslator = DoggoTranslator; //# sourceMappingURL=doggo-translator-ts.js.map