diff --git a/aio/content/images/bios/alex-eagle.jpg b/aio/content/images/bios/alex-eagle.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/alex-rickabaugh.jpg b/aio/content/images/bios/alex-rickabaugh.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/alex-wolfe.jpg b/aio/content/images/bios/alex-wolfe.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/ali.jpg b/aio/content/images/bios/ali.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/angular-gde-bio-placeholder.png b/aio/content/images/bios/angular-gde-bio-placeholder.png old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/brad-green.jpg b/aio/content/images/bios/brad-green.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/brandonroberts.jpg b/aio/content/images/bios/brandonroberts.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/chuckj.jpg b/aio/content/images/bios/chuckj.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/crisbeto.jpg b/aio/content/images/bios/crisbeto.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/david-east.jpg b/aio/content/images/bios/david-east.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/deborah.jpg b/aio/content/images/bios/deborah.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/eladbezalel.jpg b/aio/content/images/bios/eladbezalel.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/eric.jpg b/aio/content/images/bios/eric.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/fatima.jpg b/aio/content/images/bios/fatima.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/filipe-silva.jpg b/aio/content/images/bios/filipe-silva.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/gkalpak.jpg b/aio/content/images/bios/gkalpak.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/hansl.jpg b/aio/content/images/bios/hansl.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/igor-minar.jpg b/aio/content/images/bios/igor-minar.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/jbedard.jpg b/aio/content/images/bios/jbedard.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/jeff-cross.jpg b/aio/content/images/bios/jeff-cross.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/jeffwhelpley.jpg b/aio/content/images/bios/jeffwhelpley.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/jelbourn.jpg b/aio/content/images/bios/jelbourn.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/jesus-rodriguez.jpg b/aio/content/images/bios/jesus-rodriguez.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/john-papa.jpg b/aio/content/images/bios/john-papa.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/juleskremer.jpg b/aio/content/images/bios/juleskremer.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/julie-ralph.jpg b/aio/content/images/bios/julie-ralph.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/kapunahelewong.jpg b/aio/content/images/bios/kapunahelewong.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/kara-erickson.jpg b/aio/content/images/bios/kara-erickson.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/kathy.jpg b/aio/content/images/bios/kathy.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/lucas.jpg b/aio/content/images/bios/lucas.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/marclaval.jpg b/aio/content/images/bios/marclaval.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/marcy.jpg b/aio/content/images/bios/marcy.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/martin-probst.jpg b/aio/content/images/bios/martin-probst.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/martinstaffa.jpg b/aio/content/images/bios/martinstaffa.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/matias.jpg b/aio/content/images/bios/matias.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/max-sills.jpg b/aio/content/images/bios/max-sills.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/michal.jpg b/aio/content/images/bios/michal.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/misko.jpg b/aio/content/images/bios/misko.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/naomi.jpg b/aio/content/images/bios/naomi.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/pascalprecht.jpg b/aio/content/images/bios/pascalprecht.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/patrick-stapleton.jpg b/aio/content/images/bios/patrick-stapleton.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/pawel.jpg b/aio/content/images/bios/pawel.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/pete.jpg b/aio/content/images/bios/pete.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/rado.jpg b/aio/content/images/bios/rado.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/ralph.jpg b/aio/content/images/bios/ralph.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/rex.jpg b/aio/content/images/bios/rex.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/rmesserle.jpg b/aio/content/images/bios/rmesserle.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/rob-wormald.jpg b/aio/content/images/bios/rob-wormald.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/ryan.jpg b/aio/content/images/bios/ryan.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/scott.jpg b/aio/content/images/bios/scott.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/shahar.jpg b/aio/content/images/bios/shahar.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/shannon.jpg b/aio/content/images/bios/shannon.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/shield-bio-placeholder.png b/aio/content/images/bios/shield-bio-placeholder.png old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/stephenfluin.jpg b/aio/content/images/bios/stephenfluin.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/teropa.jpg b/aio/content/images/bios/teropa.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/thomas.jpg b/aio/content/images/bios/thomas.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/tobias.jpg b/aio/content/images/bios/tobias.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/tonyc.jpg b/aio/content/images/bios/tonyc.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/topherfangio.jpg b/aio/content/images/bios/topherfangio.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/torgeirhelgevold.jpg b/aio/content/images/bios/torgeirhelgevold.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/victor.jpg b/aio/content/images/bios/victor.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/vikram.jpg b/aio/content/images/bios/vikram.jpg old mode 100644 new mode 100755 diff --git a/aio/content/images/bios/wardbell.jpg b/aio/content/images/bios/wardbell.jpg old mode 100644 new mode 100755 diff --git a/aio/src/assets/images/logos/angular/angular-logo-banner.png b/aio/src/assets/images/logos/angular/angular-logo-banner.png old mode 100644 new mode 100755 diff --git a/aio/src/assets/images/logos/angular/angular.png b/aio/src/assets/images/logos/angular/angular.png old mode 100644 new mode 100755 diff --git a/aio/src/assets/images/logos/angular/angular.svg b/aio/src/assets/images/logos/angular/angular.svg old mode 100644 new mode 100755 diff --git a/aio/src/assets/images/logos/angular/angular_solidBlack.png b/aio/src/assets/images/logos/angular/angular_solidBlack.png old mode 100644 new mode 100755 diff --git a/aio/src/assets/images/logos/angular/angular_solidBlack.svg b/aio/src/assets/images/logos/angular/angular_solidBlack.svg old mode 100644 new mode 100755 diff --git a/aio/src/assets/images/logos/angular/angular_whiteTransparent.png b/aio/src/assets/images/logos/angular/angular_whiteTransparent.png old mode 100644 new mode 100755 diff --git a/aio/src/assets/images/logos/angular/shield-with-beta.png b/aio/src/assets/images/logos/angular/shield-with-beta.png old mode 100644 new mode 100755 diff --git a/packages/compiler-cli/integrationtest/src/entry_components.ts b/packages/compiler-cli/integrationtest/src/entry_components.ts index f969dd25d2941f..463ba825545460 100644 --- a/packages/compiler-cli/integrationtest/src/entry_components.ts +++ b/packages/compiler-cli/integrationtest/src/entry_components.ts @@ -10,7 +10,11 @@ import {ANALYZE_FOR_ENTRY_COMPONENTS, Component, ComponentFactoryResolver, Injec import {BasicComp} from './basic'; -@Component({selector: 'cmp-entryComponents', template: '', entryComponents: [BasicComp]}) +@Component({ + selector: 'cmp-entryComponents', + template: '

Welcome

', + entryComponents: [BasicComp] +}) export class CompWithEntryComponents { constructor(public cfr: ComponentFactoryResolver) {} } diff --git a/packages/compiler-cli/integrationtest/test/i18n_spec.ts b/packages/compiler-cli/integrationtest/test/i18n_spec.ts index 019b354ce9c03a..92fdc3199e6281 100644 --- a/packages/compiler-cli/integrationtest/test/i18n_spec.ts +++ b/packages/compiler-cli/integrationtest/test/i18n_spec.ts @@ -34,9 +34,10 @@ const EXPECTED_XMB = ` ]> - translate me - Welcome - other-3rdP-component + src/basic.ts:1translate me + src/basic.ts:5src/entry_components.ts:1Welcome + node_modules/third_party/other_comp.d.ts:1,2other-3rdP-component +multi-lines `; @@ -47,16 +48,33 @@ const EXPECTED_XLIFF = ` translate me + + src/basic.ts + 1 + desc meaning Welcome + + src/basic.ts + 5 + + + src/entry_components.ts + 1 + - - other-3rdP-component + + other-3rdP-component +multi-lines + + node_modules/third_party/other_comp.d.ts + 1 + diff --git a/packages/compiler-cli/integrationtest/test/ng_module_spec.ts b/packages/compiler-cli/integrationtest/test/ng_module_spec.ts index b5b76ad41afc4b..4e8a2706dfb4b1 100644 --- a/packages/compiler-cli/integrationtest/test/ng_module_spec.ts +++ b/packages/compiler-cli/integrationtest/test/ng_module_spec.ts @@ -59,7 +59,8 @@ describe('NgModule', () => { const fixture = createComponent(ComponentUsingThirdParty); const thirdPComps = fixture.nativeElement.children; expect(thirdPComps[0].children[0].children[0].data).toEqual('3rdP-component'); - expect(thirdPComps[1].children[0].children[0].data).toEqual('other-3rdP-component'); + expect(thirdPComps[1].children[0].children[0].data).toEqual(`other-3rdP-component +multi-lines`); }); // https://github.com/angular/angular/issues/12428 diff --git a/packages/compiler-cli/integrationtest/third_party_src/other_comp.ts b/packages/compiler-cli/integrationtest/third_party_src/other_comp.ts index 553e08ba45a3fd..130baabd8f564e 100644 --- a/packages/compiler-cli/integrationtest/third_party_src/other_comp.ts +++ b/packages/compiler-cli/integrationtest/third_party_src/other_comp.ts @@ -10,7 +10,8 @@ import {Component} from '@angular/core'; @Component({ selector: 'another-third-party-comp', - template: '
other-3rdP-component
', + template: `
other-3rdP-component +multi-lines
`, }) export class AnotherThirdpartyComponent { -} \ No newline at end of file +} diff --git a/packages/compiler-cli/src/extractor.ts b/packages/compiler-cli/src/extractor.ts index 1d929c8e7a2145..68ee22585a2613 100644 --- a/packages/compiler-cli/src/extractor.ts +++ b/packages/compiler-cli/src/extractor.ts @@ -59,8 +59,9 @@ export class Extractor { default: serializer = new compiler.Xliff(); } - - return bundle.write(serializer); + return bundle.write( + serializer, + (sourcePath: string) => sourcePath.replace(path.join(this.options.basePath, '/'), '')); } getExtension(formatName: string): string { diff --git a/packages/compiler/src/i18n/i18n_ast.ts b/packages/compiler/src/i18n/i18n_ast.ts index 1e94ea416f7d55..c2d18649341f68 100644 --- a/packages/compiler/src/i18n/i18n_ast.ts +++ b/packages/compiler/src/i18n/i18n_ast.ts @@ -9,6 +9,8 @@ import {ParseSourceSpan} from '../parse_util'; export class Message { + sources: MessageSpan[]; + /** * @param nodes message AST * @param placeholders maps placeholder names to static content @@ -20,7 +22,28 @@ export class Message { constructor( public nodes: Node[], public placeholders: {[phName: string]: string}, public placeholderToMessage: {[phName: string]: Message}, public meaning: string, - public description: string, public id: string) {} + public description: string, public id: string) { + if (nodes.length) { + this.sources = [{ + filePath: nodes[0].sourceSpan.start.file.url, + startLine: nodes[0].sourceSpan.start.line + 1, + startCol: nodes[0].sourceSpan.start.col + 1, + endLine: nodes[nodes.length - 1].sourceSpan.end.line + 1, + endCol: nodes[0].sourceSpan.start.col + 1 + }]; + } else { + this.sources = []; + } + } +} + +// line and columns indexes are 1 based +export interface MessageSpan { + filePath: string; + startLine: number; + startCol: number; + endLine: number; + endCol: number; } export interface Node { @@ -131,4 +154,4 @@ export class RecurseVisitor implements Visitor { visitPlaceholder(ph: Placeholder, context?: any): any{}; visitIcuPlaceholder(ph: IcuPlaceholder, context?: any): any{}; -} \ No newline at end of file +} diff --git a/packages/compiler/src/i18n/message_bundle.ts b/packages/compiler/src/i18n/message_bundle.ts index 8016bc0d3f3980..54c72455800d80 100644 --- a/packages/compiler/src/i18n/message_bundle.ts +++ b/packages/compiler/src/i18n/message_bundle.ts @@ -48,7 +48,7 @@ export class MessageBundle { // The public (serialized) format might be different, see the `write` method. getMessages(): i18n.Message[] { return this._messages; } - write(serializer: Serializer): string { + write(serializer: Serializer, filterSources?: (path: string) => string): string { const messages: {[id: string]: i18n.Message} = {}; const mapperVisitor = new MapPlaceholderNames(); @@ -57,6 +57,8 @@ export class MessageBundle { const id = serializer.digest(message); if (!messages.hasOwnProperty(id)) { messages[id] = message; + } else { + messages[id].sources.push(...message.sources); } }); @@ -65,7 +67,13 @@ export class MessageBundle { const mapper = serializer.createNameMapper(messages[id]); const src = messages[id]; const nodes = mapper ? mapperVisitor.convert(src.nodes, mapper) : src.nodes; - return new i18n.Message(nodes, {}, {}, src.meaning, src.description, id); + let transformedMessage = new i18n.Message(nodes, {}, {}, src.meaning, src.description, id); + transformedMessage.sources = src.sources; + if (filterSources) { + transformedMessage.sources.forEach( + (source: i18n.MessageSpan) => source.filePath = filterSources(source.filePath)); + } + return transformedMessage; }); return serializer.write(msgList, this._locale); diff --git a/packages/compiler/src/i18n/serializers/xliff.ts b/packages/compiler/src/i18n/serializers/xliff.ts index dbc9fffb8ffe11..f64e9a58f15df2 100644 --- a/packages/compiler/src/i18n/serializers/xliff.ts +++ b/packages/compiler/src/i18n/serializers/xliff.ts @@ -25,6 +25,8 @@ const _FILE_TAG = 'file'; const _SOURCE_TAG = 'source'; const _TARGET_TAG = 'target'; const _UNIT_TAG = 'trans-unit'; +const _CONTEXT_GROUP_TAG = 'context-group'; +const _CONTEXT_TAG = 'context'; // 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 @@ -34,10 +36,24 @@ export class Xliff extends Serializer { const transUnits: xml.Node[] = []; messages.forEach(message => { + let contextTags: xml.Node[] = []; + message.sources.forEach((source: i18n.MessageSpan) => { + let contextGroupTag = new xml.Tag(_CONTEXT_GROUP_TAG, {purpose: 'location'}); + contextGroupTag.children.push( + new xml.CR(10), + new xml.Tag( + _CONTEXT_TAG, {'context-type': 'sourcefile'}, [new xml.Text(source.filePath)]), + new xml.CR(10), new xml.Tag( + _CONTEXT_TAG, {'context-type': 'linenumber'}, + [new xml.Text(`${source.startLine}`)]), + new xml.CR(8)); + contextTags.push(new xml.CR(8), contextGroupTag); + }); + const transUnit = new xml.Tag(_UNIT_TAG, {id: message.id, datatype: 'html'}); transUnit.children.push( new xml.CR(8), new xml.Tag(_SOURCE_TAG, {}, visitor.serialize(message.nodes)), - new xml.CR(8), new xml.Tag(_TARGET_TAG)); + new xml.CR(8), new xml.Tag(_TARGET_TAG), ...contextTags); if (message.description) { transUnit.children.push( diff --git a/packages/compiler/src/i18n/serializers/xmb.ts b/packages/compiler/src/i18n/serializers/xmb.ts index 9110b27221dc94..c9ee3eb52b7242 100644 --- a/packages/compiler/src/i18n/serializers/xmb.ts +++ b/packages/compiler/src/i18n/serializers/xmb.ts @@ -16,6 +16,7 @@ const _MESSAGES_TAG = 'messagebundle'; const _MESSAGE_TAG = 'msg'; const _PLACEHOLDER_TAG = 'ph'; const _EXEMPLE_TAG = 'ex'; +const _SOURCE_TAG = 'source'; const _DOCTYPE = ` @@ -54,8 +55,17 @@ export class Xmb extends Serializer { attrs['meaning'] = message.meaning; } + let sourceTags: xml.Tag[] = []; + message.sources.forEach((source: i18n.MessageSpan) => { + sourceTags.push(new xml.Tag(_SOURCE_TAG, {}, [ + new xml.Text( + `${source.filePath}:${source.startLine}${source.endLine !== source.startLine ? ',' + source.endLine : ''}`) + ])); + }); + rootNode.children.push( - new xml.CR(2), new xml.Tag(_MESSAGE_TAG, attrs, visitor.serialize(message.nodes))); + new xml.CR(2), + new xml.Tag(_MESSAGE_TAG, attrs, [...sourceTags, ...visitor.serialize(message.nodes)])); }); rootNode.children.push(new xml.CR()); diff --git a/packages/compiler/test/i18n/digest_spec.ts b/packages/compiler/test/i18n/digest_spec.ts index 7297f6cc76130d..532430d64f9846 100644 --- a/packages/compiler/test/i18n/digest_spec.ts +++ b/packages/compiler/test/i18n/digest_spec.ts @@ -19,6 +19,7 @@ export function main(): void { placeholderToMessage: {}, meaning: '', description: '', + sources: [], })).toEqual('i'); }); }); diff --git a/packages/compiler/test/i18n/serializers/xliff_spec.ts b/packages/compiler/test/i18n/serializers/xliff_spec.ts index f16dbc57adb536..0de2b11cfca025 100644 --- a/packages/compiler/test/i18n/serializers/xliff_spec.ts +++ b/packages/compiler/test/i18n/serializers/xliff_spec.ts @@ -19,6 +19,7 @@ const HTML = `

translatable element with placeholders {{ interpolation}}

{ count, plural, =0 {

test

}}

foo

+

foo

foo

foo


@@ -33,10 +34,18 @@ const WRITE_XLIFF = ` translatable attribute + + file.ts + 2 + translatable element with placeholders + + file.ts + 3 + {VAR_PLURAL, plural, =0 {test} } @@ -45,22 +54,42 @@ const WRITE_XLIFF = ` foo + + file.ts + 4 + + + file.ts + 5 + d m foo + + file.ts + 6 + d m foo + + file.ts + 7 + + + file.ts + 8 + ph names @@ -83,10 +112,18 @@ const LOAD_XLIFF = ` translatable attribute etubirtta elbatalsnart + + file.ts + 1 + translatable element with placeholders footnemele elbatalsnart sredlohecalp htiw + + file.ts + 2 + {VAR_PLURAL, plural, =0 {test} } @@ -95,27 +132,47 @@ const LOAD_XLIFF = ` foo oof + + file.ts + 3 + d m foo toto + + file.ts + 4 + d m foo tata + + file.ts + 5 + + + file.ts + 6 + ph names + + file.ts + 6 + ph names @@ -136,7 +193,7 @@ export function main(): void { function toXliff(html: string, locale: string | null = null): string { const catalog = new MessageBundle(new HtmlParser, [], {}, locale); - catalog.updateFromTemplate(html, '', DEFAULT_INTERPOLATION_CONFIG); + catalog.updateFromTemplate(html, 'file.ts', DEFAULT_INTERPOLATION_CONFIG); return catalog.write(serializer); } diff --git a/packages/compiler/test/i18n/serializers/xmb_spec.ts b/packages/compiler/test/i18n/serializers/xmb_spec.ts index cb8c535fd52c6d..58084111b4adb9 100644 --- a/packages/compiler/test/i18n/serializers/xmb_spec.ts +++ b/packages/compiler/test/i18n/serializers/xmb_spec.ts @@ -21,7 +21,9 @@ export function main(): void {

foo

foo

{ count, plural, =0 { { sex, select, other {

deeply nested

}} }}

-

{ count, plural, =0 { { sex, select, other {

deeply nested

}} }}

`; +

{ count, plural, =0 { { sex, select, other {

deeply nested

}} }}

+

multi +lines

`; const XMB = ` ]> - translatable element <b>with placeholders</b> INTERPOLATION - {VAR_PLURAL, plural, =0 {<p>test</p>} } - foo - foo - foo - {VAR_PLURAL, plural, =0 {{VAR_SELECT, select, other {<p>deeply nested</p>} } } } - {VAR_PLURAL, plural, =0 {{VAR_SELECT, select, other {<p>deeply nested</p>} } } } + file.ts:3translatable element <b>with placeholders</b> INTERPOLATION + file.ts:4{VAR_PLURAL, plural, =0 {<p>test</p>} } + file.ts:5foo + file.ts:6foo + file.ts:7foo + file.ts:8{VAR_PLURAL, plural, =0 {{VAR_SELECT, select, other {<p>deeply nested</p>} } } } + file.ts:9{VAR_PLURAL, plural, =0 {{VAR_SELECT, select, other {<p>deeply nested</p>} } } } + file.ts:10,11multi +lines `; it('should write a valid xmb file', () => { - expect(toXmb(HTML)).toEqual(XMB); + expect(toXmb(HTML, 'file.ts')).toEqual(XMB); // the locale is not specified in the xmb file - expect(toXmb(HTML, 'fr')).toEqual(XMB); + expect(toXmb(HTML, 'file.ts', 'fr')).toEqual(XMB); }); it('should throw when trying to load an xmb file', () => { @@ -71,11 +75,11 @@ export function main(): void { }); } -function toXmb(html: string, locale: string | null = null): string { +function toXmb(html: string, url: string, locale: string | null = null): string { const catalog = new MessageBundle(new HtmlParser, [], {}, locale); const serializer = new Xmb(); - catalog.updateFromTemplate(html, '', DEFAULT_INTERPOLATION_CONFIG); + catalog.updateFromTemplate(html, url, DEFAULT_INTERPOLATION_CONFIG); return catalog.write(serializer); } diff --git a/packages/compiler/test/i18n/translation_bundle_spec.ts b/packages/compiler/test/i18n/translation_bundle_spec.ts index d0dff34e652ccb..1a78e89d2bb721 100644 --- a/packages/compiler/test/i18n/translation_bundle_spec.ts +++ b/packages/compiler/test/i18n/translation_bundle_spec.ts @@ -17,8 +17,9 @@ import {_extractMessages} from './i18n_parser_spec'; export function main(): void { describe('TranslationBundle', () => { const file = new ParseSourceFile('content', 'url'); - const location = new ParseLocation(file, 0, 0, 0); - const span = new ParseSourceSpan(location, null !); + const startLocation = new ParseLocation(file, 0, 0, 0); + const endLocation = new ParseLocation(file, 0, 0, 7); + const span = new ParseSourceSpan(startLocation, endLocation); const srcNode = new i18n.Text('src', span); it('should translate a plain message', () => {