/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import {NgLocalization} from '@angular/common'; import {ResourceLoader} from '@angular/compiler'; import {MessageBundle} from '@angular/compiler/src/i18n/message_bundle'; import {Xliff2} from '@angular/compiler/src/i18n/serializers/xliff2'; import {HtmlParser} from '@angular/compiler/src/ml_parser/html_parser'; import {DEFAULT_INTERPOLATION_CONFIG} from '@angular/compiler/src/ml_parser/interpolation_config'; import {DebugElement, TRANSLATIONS, TRANSLATIONS_FORMAT} from '@angular/core'; import {ComponentFixture, TestBed, async} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; import {SpyResourceLoader} from '../spies'; import {FrLocalization, HTML, I18nComponent, validateHtml} from './integration_common'; { describe('i18n XLIFF 2.0 integration spec', () => { beforeEach(async(() => { TestBed.configureCompiler({ providers: [ SpyResourceLoader.PROVIDE, FrLocalization.PROVIDE, {provide: TRANSLATIONS, useValue: XLIFF2_TOMERGE}, {provide: TRANSLATIONS_FORMAT, useValue: 'xlf2'}, ] }); TestBed.configureTestingModule({declarations: [I18nComponent]}); })); it('should extract from templates', () => { const catalog = new MessageBundle(new HtmlParser, [], {}); const serializer = new Xliff2(); catalog.updateFromTemplate(HTML, 'file.ts', DEFAULT_INTERPOLATION_CONFIG); expect(catalog.write(serializer)).toContain(XLIFF2_EXTRACTED); }); it('should translate templates', () => { const tb: ComponentFixture = TestBed.overrideTemplate(I18nComponent, HTML).createComponent(I18nComponent); const cmp: I18nComponent = tb.componentInstance; const el: DebugElement = tb.debugElement; validateHtml(tb, cmp, el); }); }); } const XLIFF2_TOMERGE = ` i18n attribute on tags attributs i18n sur les balises nested imbriqué nested imbriqué with placeholders avec des espaces réservés file.ts:11 with nested placeholders avec espaces réservés imbriqués on not translatable node sur des balises non traductibles on translatable node sur des balises traductibles {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} } {VAR_PLURAL, plural, =0 {zero} =1 {un} =2 {deux} other {beaucoup} } file.ts:23 {VAR_SELECT, select, other {other} male {m} female {female} } {VAR_SELECT, select, other {autre} male {homme} female {femme} } file.ts:25,27 {VAR_SELECT, select, male {m} female {f} } {VAR_SELECT, select, male {homme} female {femme} } sex = sexe = in a translatable section dans une section traductible Markers in html comments Balises dans les commentaires html it should work ca devrait marcher with an explicit ID avec un ID explicite {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} } {VAR_PLURAL, plural, =0 {zero} =1 {un} =2 {deux} other {beaucoup} } {VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found results} } {VAR_PLURAL, plural, =0 {Pas de réponse} =1 {une réponse} other {Trouvé réponses} } foobar FOOBAR `; const XLIFF2_EXTRACTED = ` file.ts:3 i18n attribute on tags file.ts:5 nested different meaning file.ts:7 nested file.ts:9 file.ts:10 with placeholders file.ts:11 with nested placeholders file.ts:14 on not translatable node file.ts:15 on translatable node file.ts:20 file.ts:37 {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} } file.ts:22,24 file.ts:23 {VAR_SELECT, select, male {m} female {f} other {other} } file.ts:25,27 file.ts:26 {VAR_SELECT, select, male {m} female {f} } file.ts:29 file.ts:30 sex = file.ts:31 file.ts:36 file.ts:54 in a translatable section file.ts:34,38 Markers in html comments file.ts:40 it should work file.ts:42 with an explicit ID file.ts:43 {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} } desc file.ts:46,52 {VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found results} } file.ts:54 foobar file.ts:56 `;