diff --git a/modules/@angular/compiler/src/i18n/serializers/xliff.ts b/modules/@angular/compiler/src/i18n/serializers/xliff.ts index bbb066770e..f30398157d 100644 --- a/modules/@angular/compiler/src/i18n/serializers/xliff.ts +++ b/modules/@angular/compiler/src/i18n/serializers/xliff.ts @@ -190,7 +190,11 @@ class XliffParser implements ml.Visitor { this._addError(element, `Duplicated translations for msg ${id}`); } else { ml.visitAll(this, element.children, null); - this._mlNodesByMsgId[id] = this._unitMlNodes; + if (this._unitMlNodes) { + this._mlNodesByMsgId[id] = this._unitMlNodes; + } else { + this._addError(element, `Message ${id} misses a translation`); + } } } break; diff --git a/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts b/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts index 1db9851132..5c8f9af5a3 100644 --- a/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts +++ b/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts @@ -113,6 +113,24 @@ export function main(): void { }); describe('structure errors', () => { + it('should throw when a trans-unit has no translation', () => { + const XLIFF = ` + + + + + + + + +`; + + expect(() => { + loadAsMap(XLIFF); + }).toThrowError(/Message missingtarget misses a translation/); + }); + + it('should throw when a trans-unit has no id attribute', () => { const XLIFF = `