diff --git a/modules/@angular/compiler/src/i18n/serializers/xliff.ts b/modules/@angular/compiler/src/i18n/serializers/xliff.ts
index c1fc9540bc..08b0c84fa8 100644
--- a/modules/@angular/compiler/src/i18n/serializers/xliff.ts
+++ b/modules/@angular/compiler/src/i18n/serializers/xliff.ts
@@ -27,7 +27,6 @@ const _PLACEHOLDER_TAG = 'x';
const _SOURCE_TAG = 'source';
const _TARGET_TAG = 'target';
const _UNIT_TAG = 'trans-unit';
-const _CR = (ws: number = 0) => new xml.Text(`\n${new Array(ws).join(' ')}`);
// http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html
// http://docs.oasis-open.org/xliff/v1.2/xliff-profile-html/xliff-profile-html-1.2.html
@@ -44,34 +43,37 @@ export class Xliff implements Serializer {
let transUnit = new xml.Tag(_UNIT_TAG, {id: id, datatype: 'html'});
transUnit.children.push(
- _CR(8), new xml.Tag(_SOURCE_TAG, {}, visitor.serialize(message.nodes)), _CR(8),
- new xml.Tag(_TARGET_TAG));
+ new xml.CR(8), new xml.Tag(_SOURCE_TAG, {}, visitor.serialize(message.nodes)),
+ new xml.CR(8), new xml.Tag(_TARGET_TAG));
if (message.description) {
transUnit.children.push(
- _CR(8),
+ new xml.CR(8),
new xml.Tag(
'note', {priority: '1', from: 'description'}, [new xml.Text(message.description)]));
}
if (message.meaning) {
transUnit.children.push(
- _CR(8),
+ new xml.CR(8),
new xml.Tag('note', {priority: '1', from: 'meaning'}, [new xml.Text(message.meaning)]));
}
- transUnit.children.push(_CR(6));
+ transUnit.children.push(new xml.CR(6));
- transUnits.push(_CR(6), transUnit);
+ transUnits.push(new xml.CR(6), transUnit);
});
- const body = new xml.Tag('body', {}, [...transUnits, _CR(4)]);
+ const body = new xml.Tag('body', {}, [...transUnits, new xml.CR(4)]);
const file = new xml.Tag(
'file', {'source-language': _SOURCE_LANG, datatype: 'plaintext', original: 'ng2.template'},
- [_CR(4), body, _CR(2)]);
- const xliff = new xml.Tag('xliff', {version: _VERSION, xmlns: _XMLNS}, [_CR(2), file, _CR()]);
+ [new xml.CR(4), body, new xml.CR(2)]);
+ const xliff = new xml.Tag(
+ 'xliff', {version: _VERSION, xmlns: _XMLNS}, [new xml.CR(2), file, new xml.CR()]);
- return xml.serialize([new xml.Declaration({version: '1.0', encoding: 'UTF-8'}), _CR(), xliff]);
+ return xml.serialize([
+ new xml.Declaration({version: '1.0', encoding: 'UTF-8'}), new xml.CR(), xliff, new xml.CR()
+ ]);
}
load(content: string, url: string, messageBundle: MessageBundle): {[id: string]: ml.Node[]} {
diff --git a/modules/@angular/compiler/src/i18n/serializers/xmb.ts b/modules/@angular/compiler/src/i18n/serializers/xmb.ts
index e19391fd4b..d582ef569b 100644
--- a/modules/@angular/compiler/src/i18n/serializers/xmb.ts
+++ b/modules/@angular/compiler/src/i18n/serializers/xmb.ts
@@ -43,7 +43,6 @@ export class Xmb implements Serializer {
write(messageMap: {[k: string]: i18n.Message}): string {
const visitor = new _Visitor();
let rootNode = new xml.Tag(_MESSAGES_TAG);
- rootNode.children.push(new xml.Text('\n'));
Object.keys(messageMap).forEach((id) => {
const message = messageMap[id];
@@ -58,16 +57,18 @@ export class Xmb implements Serializer {
}
rootNode.children.push(
- new xml.Text(' '), new xml.Tag(_MESSAGE_TAG, attrs, visitor.serialize(message.nodes)),
- new xml.Text('\n'));
+ new xml.CR(2), new xml.Tag(_MESSAGE_TAG, attrs, visitor.serialize(message.nodes)));
});
+ rootNode.children.push(new xml.CR());
+
return xml.serialize([
new xml.Declaration({version: '1.0', encoding: 'UTF-8'}),
- new xml.Text('\n'),
+ new xml.CR(),
new xml.Doctype(_MESSAGES_TAG, _DOCTYPE),
- new xml.Text('\n'),
+ new xml.CR(),
rootNode,
+ new xml.CR(),
]);
}
diff --git a/modules/@angular/compiler/src/i18n/serializers/xml_helper.ts b/modules/@angular/compiler/src/i18n/serializers/xml_helper.ts
index d5d142581d..e7cbc8bbcb 100644
--- a/modules/@angular/compiler/src/i18n/serializers/xml_helper.ts
+++ b/modules/@angular/compiler/src/i18n/serializers/xml_helper.ts
@@ -88,6 +88,10 @@ export class Text implements Node {
visit(visitor: IVisitor): any { return visitor.visitText(this); }
}
+export class CR extends Text {
+ constructor(ws: number = 0) { super(`\n${new Array(ws + 1).join(' ')}`); }
+}
+
const _ESCAPED_CHARS: [RegExp, string][] = [
[/&/g, '&'],
[/"/g, '"'],
diff --git a/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts b/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts
index 48f376b23b..5d9ea96a3b 100644
--- a/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts
+++ b/modules/@angular/compiler/test/i18n/serializers/xliff_spec.ts
@@ -21,47 +21,49 @@ const HTML = `
const WRITE_XLIFF = `
-
-
-
-
-
-
-
-
-
-
-
-
-
- d
- m
-
-
-
-`;
+
+
+
+
+
+
+
+
+
+
+
+
+
+ d
+ m
+
+
+
+
+`;
const LOAD_XLIFF = `
-
-
-
-
- etubirtta elbatalsnart
-
-
-
- footnemele elbatalsnart sredlohecalp htiw
-
-
-
- oof
- d
- m
-
-
-
-`;
+
+
+
+
+ etubirtta elbatalsnart
+
+
+
+ footnemele elbatalsnart sredlohecalp htiw
+
+
+
+ oof
+ d
+ m
+
+
+
+
+`;
export function main(): void {
let serializer: Xliff;
diff --git a/modules/@angular/compiler/test/i18n/serializers/xmb_spec.ts b/modules/@angular/compiler/test/i18n/serializers/xmb_spec.ts
index 9243474d4c..89a5daa75c 100644
--- a/modules/@angular/compiler/test/i18n/serializers/xmb_spec.ts
+++ b/modules/@angular/compiler/test/i18n/serializers/xmb_spec.ts
@@ -6,12 +6,10 @@
* found in the LICENSE file at https://angular.io/license
*/
+import {MessageBundle} from '@angular/compiler/src/i18n/message_bundle';
import {Xmb} from '@angular/compiler/src/i18n/serializers/xmb';
-import {describe, expect, it} from '@angular/core/testing/testing_internal';
-
-import {MessageBundle} from '../../../src/i18n/message_bundle';
-import {HtmlParser} from '../../../src/ml_parser/html_parser';
-import {DEFAULT_INTERPOLATION_CONFIG} from '../../../src/ml_parser/interpolation_config';
+import {HtmlParser} from '@angular/compiler/src/ml_parser/html_parser';
+import {DEFAULT_INTERPOLATION_CONFIG} from '@angular/compiler/src/ml_parser/interpolation_config';
export function main(): void {
describe('XMB serializer', () => {
@@ -49,7 +47,8 @@ export function main(): void {
{ count, plural, =0 {<p>test</p>} }
foo
{ count, plural, =0 {{ sex, gender, other {<p>deeply nested</p>} } } }
-`;
+
+`;
it('should write a valid xmb file', () => { expect(toXmb(HTML)).toEqual(XMB); });