2016-08-12 00:00:35 -04:00
|
|
|
/**
|
|
|
|
* @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';
|
2016-08-30 21:07:40 -04:00
|
|
|
import {ResourceLoader} from '@angular/compiler';
|
2016-12-22 14:23:35 -05:00
|
|
|
import {MessageBundle} from '@angular/compiler/src/i18n/message_bundle';
|
|
|
|
import {Xmb} from '@angular/compiler/src/i18n/serializers/xmb';
|
|
|
|
import {HtmlParser} from '@angular/compiler/src/ml_parser/html_parser';
|
|
|
|
import {DEFAULT_INTERPOLATION_CONFIG} from '@angular/compiler/src/ml_parser/interpolation_config';
|
2017-03-13 06:40:22 -04:00
|
|
|
import {DebugElement, TRANSLATIONS, TRANSLATIONS_FORMAT} from '@angular/core';
|
|
|
|
import {ComponentFixture, TestBed, async} from '@angular/core/testing';
|
2017-03-02 15:12:46 -05:00
|
|
|
import {expect} from '@angular/platform-browser/testing/src/matchers';
|
2016-08-19 15:51:01 -04:00
|
|
|
|
|
|
|
import {SpyResourceLoader} from '../spies';
|
2016-08-12 00:00:35 -04:00
|
|
|
|
2017-03-13 06:40:22 -04:00
|
|
|
import {FrLocalization, HTML, I18nComponent, validateHtml} from './integration_common';
|
|
|
|
|
2017-12-16 17:42:55 -05:00
|
|
|
{
|
2017-03-13 06:40:22 -04:00
|
|
|
describe('i18n XMB/XTB integration spec', () => {
|
2016-08-12 00:00:35 -04:00
|
|
|
|
2016-08-19 15:51:01 -04:00
|
|
|
beforeEach(async(() => {
|
2016-08-12 00:00:35 -04:00
|
|
|
TestBed.configureCompiler({
|
|
|
|
providers: [
|
perf: switch angular to use StaticInjector instead of ReflectiveInjector
This change allows ReflectiveInjector to be tree shaken resulting
in not needed Reflect polyfil and smaller bundles.
Code savings for HelloWorld using Closure:
Reflective: bundle.js: 105,864(34,190 gzip)
Static: bundle.js: 154,889(33,555 gzip)
645( 2%)
BREAKING CHANGE:
`platformXXXX()` no longer accepts providers which depend on reflection.
Specifically the method signature when from `Provider[]` to
`StaticProvider[]`.
Example:
Before:
```
[
MyClass,
{provide: ClassA, useClass: SubClassA}
]
```
After:
```
[
{provide: MyClass, deps: [Dep1,...]},
{provide: ClassA, useClass: SubClassA, deps: [Dep1,...]}
]
```
NOTE: This only applies to platform creation and providers for the JIT
compiler. It does not apply to `@Compotent` or `@NgModule` provides
declarations.
Benchpress note: Previously Benchpress also supported reflective
provides, which now require static providers.
DEPRECATION:
- `ReflectiveInjector` is now deprecated as it will be remove. Use
`Injector.create` as a replacement.
closes #18496
2017-08-03 15:33:29 -04:00
|
|
|
SpyResourceLoader.PROVIDE,
|
|
|
|
FrLocalization.PROVIDE,
|
2016-08-12 17:45:36 -04:00
|
|
|
{provide: TRANSLATIONS, useValue: XTB},
|
2016-08-13 01:13:54 -04:00
|
|
|
{provide: TRANSLATIONS_FORMAT, useValue: 'xtb'},
|
2016-08-12 00:00:35 -04:00
|
|
|
]
|
|
|
|
});
|
2016-08-19 15:51:01 -04:00
|
|
|
|
|
|
|
TestBed.configureTestingModule({declarations: [I18nComponent]});
|
|
|
|
}));
|
|
|
|
|
2016-12-22 14:23:35 -05:00
|
|
|
it('should extract from templates', () => {
|
|
|
|
const catalog = new MessageBundle(new HtmlParser, [], {});
|
|
|
|
const serializer = new Xmb();
|
2017-04-14 12:06:25 -04:00
|
|
|
catalog.updateFromTemplate(HTML, 'file.ts', DEFAULT_INTERPOLATION_CONFIG);
|
2016-08-12 00:00:35 -04:00
|
|
|
|
2016-12-22 14:23:35 -05:00
|
|
|
expect(catalog.write(serializer)).toContain(XMB);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should translate templates', () => {
|
2017-03-13 06:40:22 -04:00
|
|
|
const tb: ComponentFixture<I18nComponent> =
|
|
|
|
TestBed.overrideTemplate(I18nComponent, HTML).createComponent(I18nComponent);
|
|
|
|
const cmp: I18nComponent = tb.componentInstance;
|
|
|
|
const el: DebugElement = tb.debugElement;
|
2016-08-12 00:00:35 -04:00
|
|
|
|
2017-03-13 06:40:22 -04:00
|
|
|
validateHtml(tb, cmp, el);
|
2016-08-12 00:00:35 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const XTB = `
|
|
|
|
<translationbundle>
|
2016-11-07 19:20:05 -05:00
|
|
|
<translation id="615790887472569365">attributs i18n sur les balises</translation>
|
|
|
|
<translation id="3707494640264351337">imbriqué</translation>
|
|
|
|
<translation id="5539162898278769904">imbriqué</translation>
|
|
|
|
<translation id="3780349238193953556"><ph name="START_ITALIC_TEXT"/>avec des espaces réservés<ph name="CLOSE_ITALIC_TEXT"/></translation>
|
2017-07-12 10:27:53 -04:00
|
|
|
<translation id="5415448997399451992"><ph name="START_TAG_DIV"><ex><div></ex></ph>avec <ph name="START_TAG_DIV"><ex><div></ex></ph>des espaces réservés<ph name="CLOSE_TAG_DIV"><ex></div></ex></ph> imbriqués<ph name="CLOSE_TAG_DIV"><ex></div></ex></ph></translation>
|
2016-11-07 19:20:05 -05:00
|
|
|
<translation id="5525133077318024839">sur des balises non traductibles</translation>
|
|
|
|
<translation id="8670732454866344690">sur des balises traductibles</translation>
|
|
|
|
<translation id="4593805537723189714">{VAR_PLURAL, plural, =0 {zero} =1 {un} =2 {deux} other {<ph name="START_BOLD_TEXT"/>beaucoup<ph name="CLOSE_BOLD_TEXT"/>}}</translation>
|
2018-01-22 15:23:10 -05:00
|
|
|
<translation id="703464324060964421"><ph name="ICU"/></translation>
|
|
|
|
<translation id="5430374139308914421">{VAR_SELECT, select, male {homme} female {femme} other {autre}}</translation>
|
|
|
|
<translation id="1300564767229037107"><ph name="ICU"/></translation>
|
|
|
|
<translation id="2500580913783245106">{VAR_SELECT, select, male {homme} female {femme}}</translation>
|
2016-11-07 19:20:05 -05:00
|
|
|
<translation id="4851788426695310455"><ph name="INTERPOLATION"/></translation>
|
|
|
|
<translation id="9013357158046221374">sexe = <ph name="INTERPOLATION"/></translation>
|
|
|
|
<translation id="8324617391167353662"><ph name="CUSTOM_NAME"/></translation>
|
|
|
|
<translation id="7685649297917455806">dans une section traductible</translation>
|
2018-01-22 15:23:10 -05:00
|
|
|
<translation id="2329001734457059408">
|
|
|
|
<ph name="START_HEADING_LEVEL1"/>Balises dans les commentaires html<ph name="CLOSE_HEADING_LEVEL1"/>
|
2016-08-12 00:00:35 -04:00
|
|
|
<ph name="START_TAG_DIV"/><ph name="CLOSE_TAG_DIV"/>
|
|
|
|
<ph name="START_TAG_DIV_1"/><ph name="ICU"/><ph name="CLOSE_TAG_DIV"></ph>
|
|
|
|
</translation>
|
2016-11-07 19:20:05 -05:00
|
|
|
<translation id="1491627405349178954">ca <ph name="START_BOLD_TEXT"/>devrait<ph name="CLOSE_BOLD_TEXT"/> marcher</translation>
|
2016-12-06 09:04:59 -05:00
|
|
|
<translation id="i18n16">avec un ID explicite</translation>
|
2018-01-22 15:23:10 -05:00
|
|
|
<translation id="i18n17">{VAR_PLURAL, plural, =0 {zero} =1 {un} =2 {deux} other {<ph
|
2016-12-06 09:04:59 -05:00
|
|
|
name="START_BOLD_TEXT"><ex><b></ex></ph>beaucoup<ph name="CLOSE_BOLD_TEXT"><ex></b></ex></ph>} }</translation>
|
2017-01-06 14:28:09 -05:00
|
|
|
<translation id="4085484936881858615">{VAR_PLURAL, plural, =0 {Pas de réponse} =1 {une réponse} other {<ph name="INTERPOLATION"><ex>INTERPOLATION</ex></ph> réponse} }</translation>
|
|
|
|
<translation id="4035252431381981115">FOO<ph name="START_LINK"><ex><a></ex></ph>BAR<ph name="CLOSE_LINK"><ex></a></ex></ph></translation>
|
2017-01-17 20:36:16 -05:00
|
|
|
<translation id="5339604010413301604"><ph name="MAP_NAME"><ex>MAP_NAME</ex></ph></translation>
|
2016-08-12 00:00:35 -04:00
|
|
|
</translationbundle>`;
|
|
|
|
|
2017-07-13 07:55:15 -04:00
|
|
|
const XMB = `<msg id="615790887472569365"><source>file.ts:3</source>i18n attribute on tags</msg>
|
2017-04-14 12:06:25 -04:00
|
|
|
<msg id="3707494640264351337"><source>file.ts:5</source>nested</msg>
|
|
|
|
<msg id="5539162898278769904" meaning="different meaning"><source>file.ts:7</source>nested</msg>
|
|
|
|
<msg id="3780349238193953556"><source>file.ts:9</source><source>file.ts:10</source><ph name="START_ITALIC_TEXT"><ex><i></ex></ph>with placeholders<ph name="CLOSE_ITALIC_TEXT"><ex></i></ex></ph></msg>
|
2017-07-12 10:27:53 -04:00
|
|
|
<msg id="5415448997399451992"><source>file.ts:11</source><ph name="START_TAG_DIV"><ex><div></ex></ph>with <ph name="START_TAG_DIV"><ex><div></ex></ph>nested<ph name="CLOSE_TAG_DIV"><ex></div></ex></ph> placeholders<ph name="CLOSE_TAG_DIV"><ex></div></ex></ph></msg>
|
|
|
|
<msg id="5525133077318024839"><source>file.ts:14</source>on not translatable node</msg>
|
|
|
|
<msg id="8670732454866344690"><source>file.ts:15</source>on translatable node</msg>
|
|
|
|
<msg id="4593805537723189714"><source>file.ts:20</source><source>file.ts:37</source>{VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {<ph name="START_BOLD_TEXT"><ex><b></ex></ph>many<ph name="CLOSE_BOLD_TEXT"><ex></b></ex></ph>} }</msg>
|
2018-01-22 15:23:10 -05:00
|
|
|
<msg id="703464324060964421"><source>file.ts:22,24</source>
|
|
|
|
<ph name="ICU"><ex>{sex, select, male {...} female {...} other {...}}</ex></ph>
|
2016-08-12 00:00:35 -04:00
|
|
|
</msg>
|
2018-01-22 15:23:10 -05:00
|
|
|
<msg id="5430374139308914421"><source>file.ts:23</source>{VAR_SELECT, select, male {m} female {f} other {other} }</msg>
|
|
|
|
<msg id="1300564767229037107"><source>file.ts:25,27</source>
|
|
|
|
<ph name="ICU"><ex>{sexB, select, male {...} female {...}}</ex></ph>
|
2017-07-13 07:55:15 -04:00
|
|
|
</msg>
|
2018-01-22 15:23:10 -05:00
|
|
|
<msg id="2500580913783245106"><source>file.ts:26</source>{VAR_SELECT, select, male {m} female {f} }</msg>
|
2017-07-12 10:27:53 -04:00
|
|
|
<msg id="4851788426695310455"><source>file.ts:29</source><ph name="INTERPOLATION"><ex>{{ "count = " + count }}</ex></ph></msg>
|
|
|
|
<msg id="9013357158046221374"><source>file.ts:30</source>sex = <ph name="INTERPOLATION"><ex>{{ sex }}</ex></ph></msg>
|
|
|
|
<msg id="8324617391167353662"><source>file.ts:31</source><ph name="CUSTOM_NAME"><ex>{{ "custom name" //i18n(ph="CUSTOM_NAME") }}</ex></ph></msg>
|
|
|
|
<msg id="7685649297917455806"><source>file.ts:36</source><source>file.ts:54</source>in a translatable section</msg>
|
2018-01-22 15:23:10 -05:00
|
|
|
<msg id="2329001734457059408"><source>file.ts:34,38</source>
|
|
|
|
<ph name="START_HEADING_LEVEL1"><ex><h1></ex></ph>Markers in html comments<ph name="CLOSE_HEADING_LEVEL1"><ex></h1></ex></ph>
|
2016-08-12 00:00:35 -04:00
|
|
|
<ph name="START_TAG_DIV"><ex><div></ex></ph><ph name="CLOSE_TAG_DIV"><ex></div></ex></ph>
|
2017-07-12 10:27:53 -04:00
|
|
|
<ph name="START_TAG_DIV_1"><ex><div></ex></ph><ph name="ICU"><ex>{count, plural, =0 {...} =1 {...} =2 {...} other {...}}</ex></ph><ph name="CLOSE_TAG_DIV"><ex></div></ex></ph>
|
2016-08-12 00:00:35 -04:00
|
|
|
</msg>
|
2017-07-12 10:27:53 -04:00
|
|
|
<msg id="1491627405349178954"><source>file.ts:40</source>it <ph name="START_BOLD_TEXT"><ex><b></ex></ph>should<ph name="CLOSE_BOLD_TEXT"><ex></b></ex></ph> work</msg>
|
|
|
|
<msg id="i18n16"><source>file.ts:42</source>with an explicit ID</msg>
|
|
|
|
<msg id="i18n17"><source>file.ts:43</source>{VAR_PLURAL, plural, =0 {zero} =1 {one} =2 {two} other {<ph name="START_BOLD_TEXT"><ex><b></ex></ph>many<ph name="CLOSE_BOLD_TEXT"><ex></b></ex></ph>} }</msg>
|
|
|
|
<msg id="4085484936881858615" desc="desc"><source>file.ts:46,52</source>{VAR_PLURAL, plural, =0 {Found no results} =1 {Found one result} other {Found <ph name="INTERPOLATION"><ex>{{response.getItemsList().length}}</ex></ph> results} }</msg>
|
|
|
|
<msg id="4035252431381981115"><source>file.ts:54</source>foo<ph name="START_LINK"><ex><a></ex></ph>bar<ph name="CLOSE_LINK"><ex></a></ex></ph></msg>
|
|
|
|
<msg id="5339604010413301604"><source>file.ts:56</source><ph name="MAP_NAME"><ex>{{ 'test' //i18n(ph="map name") }}</ex></ph></msg>`;
|