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 = `