@tabuckner/doggo-translator-ts
Version:
A typescript doggo translator based on DoggoTranslatorCore
154 lines • 6.79 kB
JavaScript
"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