UNPKG

webpack-angular-translate

Version:

Webpack plugin that extracts the translation-ids with the default texts.

105 lines 4.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var I18N_ATTRIBUTE_REGEX = /^i18n-.*$/; var I18N_ATTRIBUTE_NAME = "i18n"; var ID_INDICATOR = "@@"; /** * Angular uses i18n and i18n-[attr] attributes for internationalization. * The angularI18nTranslationsExtractor looks for these attributes on elements * and extracts the found ids and default translations from the elements. * * @example * <div i18n="@@translationId">some translation</div> * results in a translation with id: 'translationId' and default translation: 'some translation' * * @example * <div i18n-title="@@titleId" title="some title"></div> * results in a translation with id: 'titleId' and default translation: 'some title' * * @param element the element to check for translations * @param context the current context */ function angularI18nTranslationsExtractor(element, context) { var i18nElementTranslation = element.attributes.find(function (attribute) { return attribute.name === I18N_ATTRIBUTE_NAME; }); if (i18nElementTranslation) { handleTranslationsOfElements(element, context, i18nElementTranslation); } var i18nAttributeTranslations = element.attributes.filter(function (attribute) { return I18N_ATTRIBUTE_REGEX.test(attribute.name); }); handleTranslationsOfAttributes(element, context, i18nAttributeTranslations); } exports.default = angularI18nTranslationsExtractor; function handleTranslationsOfElements(element, context, attribute) { var translationIdExtraction = extractTranslationId(attribute, context); if (translationIdExtraction.valid === false) { context.emitError(translationIdExtraction.error, attribute.startPosition); } else if (element.texts.length === 0) { context.emitError("The element " + context.asHtml() + " with attribute " + attribute.name + " is empty and is therefore missing the default translation.", attribute.startPosition); } else if (element.texts.length === 1) { context.registerTranslation({ translationId: translationIdExtraction.translationId, defaultText: element.texts[0].text, position: element.startPosition, }); } else if (element.texts.length > 1) { context.emitError("The element " + context.asHtml() + " has multiple child elements and, therefore, the default translation cannot be extracted.", attribute.startPosition); } } angularI18nTranslationsExtractor.mayContainTranslations = function (content) { return content.indexOf(I18N_ATTRIBUTE_NAME) !== -1; }; function handleTranslationsOfAttributes(element, context, i18nAttributes) { for (var _i = 0, i18nAttributes_1 = i18nAttributes; _i < i18nAttributes_1.length; _i++) { var i18nAttribute = i18nAttributes_1[_i]; handleAttribute(element, context, i18nAttribute); } } function handleAttribute(element, context, i18nAttribute) { var translationIdExtraction = extractTranslationId(i18nAttribute, context); if (translationIdExtraction.valid === false) { context.emitError(translationIdExtraction.error, i18nAttribute.startPosition); return; } var attributeName = i18nAttribute.name.substr((I18N_ATTRIBUTE_NAME + "-").length); var attribute = element.attributes.find(function (attribute) { return attribute.name === attributeName; }); if (!attribute) { context.emitError("The element " + context.asHtml() + " with " + i18nAttribute.name + " is missing a corresponding " + attributeName + " attribute.", element.startPosition); return; } var defaultText = attribute.value; if (!defaultText) { context.emitError("The element " + context.asHtml() + " with " + i18nAttribute.name + " is missing a value for the corresponding " + attributeName + " attribute.", element.startPosition); return; } context.registerTranslation({ translationId: translationIdExtraction.translationId, defaultText: defaultText, position: i18nAttribute.startPosition, }); } function extractTranslationId(attribute, context) { var index = attribute.value.indexOf(ID_INDICATOR); if (index < 0) { return { valid: false, error: "The attribute " + attribute.name + " on element " + context.asHtml() + " attribute is missing the custom id indicator '" + ID_INDICATOR + "'.", }; } else if (index + ID_INDICATOR.length === attribute.value.length) { return { valid: false, error: "The attribute " + attribute.name + " on element " + context.asHtml() + " defines an empty ID.", }; } else { return { valid: true, translationId: attribute.value.substr(index + ID_INDICATOR.length), }; } } //# sourceMappingURL=angular-i18n-translations-extractor.js.map