webpack-angular-translate
Version:
Webpack plugin that extracts the translation-ids with the default texts.
105 lines • 4.87 kB
JavaScript
;
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