/** * @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'; export function main() { describe('i18n XLIFF 2.0 integration spec', () => { beforeEach(async(() => { TestBed.configureCompiler({ providers: [ {provide: ResourceLoader, useClass: SpyResourceLoader}, {provide: NgLocalization, useClass: FrLocalization}, {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 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, 0 {other} m {male} f {female} } {VAR_SELECT, select, 0 {autre} m {homme} f {femme} } file.ts:25,27 {VAR_SELECT, select, m {male} f {female} } {VAR_SELECT, select, m {homme} f {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:13 on not translatable node file.ts:14 on translatable node file.ts:19 file.ts:36 {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} } file.ts:21,23 file.ts:22 {VAR_SELECT, select, 0 {other} m {male} f {female} } file.ts:24,26 file.ts:25 {VAR_SELECT, select, m {male} f {female} } file.ts:28 file.ts:29 sex = file.ts:30 file.ts:35 file.ts:53 in a translatable section file.ts:33,37 Markers in html comments file.ts:39 it should work file.ts:41 with an explicit ID file.ts:42 {VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {many} } desc file.ts:45,51 {VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found results} } file.ts:53 foobar file.ts:55 `;