@@ -31,18 +31,34 @@ describe('Xliff1TranslationParser', () => {
31
31
} ) ;
32
32
33
33
describe ( 'parse() [without hint]' , ( ) => {
34
- it ( 'should extract the locale from the file contents' , ( ) => {
35
- const XLIFF = `
34
+ it ( 'should extract the locale from the last `<file>` element to contain a `target-language` attribute' ,
35
+ ( ) => {
36
+ const XLIFF = `
36
37
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
38
+ <file source-language="en" datatype="plaintext" original="ng2.template">
39
+ <body></body>
40
+ </file>
37
41
<file source-language="en" target-language="fr" datatype="plaintext" original="ng2.template">
38
- <body>
39
- </body>
42
+ <body></body>
43
+ </file>
44
+ <file source-language="en" datatype="plaintext" original="ng2.template">
45
+ <body></body>
46
+ </file>
47
+ <file source-language="en" target-language="de" datatype="plaintext" original="ng2.template">
48
+ <body></body>
49
+ </file>
50
+ <file source-language="en" datatype="plaintext" original="ng2.template">
51
+ <body></body>
40
52
</file>
41
53
</xliff>` ;
42
- const parser = new Xliff1TranslationParser ( ) ;
43
- const result = parser . parse ( '/some/file.xlf' , XLIFF ) ;
44
- expect ( result . locale ) . toEqual ( 'fr' ) ;
45
- } ) ;
54
+ const parser = new Xliff1TranslationParser ( ) ;
55
+ const hint = parser . canParse ( '/some/file.xlf' , XLIFF ) ;
56
+ if ( ! hint ) {
57
+ return fail ( 'expected XLIFF to be valid' ) ;
58
+ }
59
+ const result = parser . parse ( '/some/file.xlf' , XLIFF , hint ) ;
60
+ expect ( result . locale ) . toEqual ( 'de' ) ;
61
+ } ) ;
46
62
47
63
it ( 'should return an undefined locale if there is no locale in the file' , ( ) => {
48
64
const XLIFF = `
@@ -437,6 +453,58 @@ describe('Xliff1TranslationParser', () => {
437
453
. toEqual ( ɵmakeParsedTranslation ( [ 'Weiter' ] ) ) ;
438
454
} ) ;
439
455
456
+ it ( 'should merge messages from each `<file>` element' , ( ) => {
457
+ /**
458
+ * Source HTML:
459
+ *
460
+ * ```
461
+ * <div i18n>translatable attribute</div>
462
+ * ```
463
+
464
+ * ```
465
+ * <div i18n>translatable element <b>with placeholders</b> {{ interpolation}}</div>
466
+ * ```
467
+ */
468
+ const XLIFF = `
469
+ <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
470
+ <file source-language="en" target-language="fr" datatype="plaintext" original="file-1">
471
+ <body>
472
+ <trans-unit id="1933478729560469763" datatype="html">
473
+ <source>translatable attribute</source>
474
+ <target>etubirtta elbatalsnart</target>
475
+ <context-group purpose="location">
476
+ <context context-type="sourcefile">file.ts</context>
477
+ <context context-type="linenumber">1</context>
478
+ </context-group>
479
+ </trans-unit>
480
+ </body>
481
+ </file>
482
+ <file source-language="en" target-language="fr" datatype="plaintext" original="file-2">
483
+ <body>
484
+ <trans-unit id="5057824347511785081" datatype="html">
485
+ <source>translatable element <x id="START_BOLD_TEXT" ctype="b"/>with placeholders<x id="CLOSE_BOLD_TEXT" ctype="b"/> <x id="INTERPOLATION"/></source>
486
+ <target><x id="INTERPOLATION"/> tnemele elbatalsnart <x id="START_BOLD_TEXT" ctype="x-b"/>sredlohecalp htiw<x id="CLOSE_BOLD_TEXT" ctype="x-b"/></target>
487
+ <context-group purpose="location">
488
+ <context context-type="sourcefile">file.ts</context>
489
+ <context context-type="linenumber">2</context>
490
+ </context-group>
491
+ </trans-unit>
492
+ </body>
493
+ </file>
494
+ </xliff>` ;
495
+ const parser = new Xliff1TranslationParser ( ) ;
496
+ const result = parser . parse ( '/some/file.xlf' , XLIFF ) ;
497
+
498
+ expect ( result . translations [ ɵcomputeMsgId ( 'translatable attribute' ) ] )
499
+ . toEqual ( ɵmakeParsedTranslation ( [ 'etubirtta elbatalsnart' ] ) ) ;
500
+ expect (
501
+ result . translations [ ɵcomputeMsgId (
502
+ 'translatable element {$START_BOLD_TEXT}with placeholders{$LOSE_BOLD_TEXT} {$INTERPOLATION}' ) ] )
503
+ . toEqual ( ɵmakeParsedTranslation (
504
+ [ '' , ' tnemele elbatalsnart ' , 'sredlohecalp htiw' , '' ] ,
505
+ [ 'INTERPOLATION' , 'START_BOLD_TEXT' , 'CLOSE_BOLD_TEXT' ] ) ) ;
506
+ } ) ;
507
+
440
508
describe ( '[structure errors]' , ( ) => {
441
509
it ( 'should throw when a trans-unit has no translation' , ( ) => {
442
510
const XLIFF = `
@@ -547,22 +615,34 @@ describe('Xliff1TranslationParser', () => {
547
615
} ) ;
548
616
549
617
describe ( 'parse() [with hint]' , ( ) => {
550
- it ( 'should extract the locale from the file contents' , ( ) => {
551
- const XLIFF = `
618
+ it ( 'should extract the locale from the last `<file>` element to contain a `target-language` attribute' ,
619
+ ( ) => {
620
+ const XLIFF = `
552
621
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
622
+ <file source-language="en" datatype="plaintext" original="ng2.template">
623
+ <body></body>
624
+ </file>
553
625
<file source-language="en" target-language="fr" datatype="plaintext" original="ng2.template">
554
- <body>
555
- </body>
626
+ <body></body>
627
+ </file>
628
+ <file source-language="en" datatype="plaintext" original="ng2.template">
629
+ <body></body>
630
+ </file>
631
+ <file source-language="en" target-language="de" datatype="plaintext" original="ng2.template">
632
+ <body></body>
633
+ </file>
634
+ <file source-language="en" datatype="plaintext" original="ng2.template">
635
+ <body></body>
556
636
</file>
557
637
</xliff>` ;
558
- const parser = new Xliff1TranslationParser ( ) ;
559
- const hint = parser . canParse ( '/some/file.xlf' , XLIFF ) ;
560
- if ( ! hint ) {
561
- return fail ( 'expected XLIFF to be valid' ) ;
562
- }
563
- const result = parser . parse ( '/some/file.xlf' , XLIFF , hint ) ;
564
- expect ( result . locale ) . toEqual ( 'fr ' ) ;
565
- } ) ;
638
+ const parser = new Xliff1TranslationParser ( ) ;
639
+ const hint = parser . canParse ( '/some/file.xlf' , XLIFF ) ;
640
+ if ( ! hint ) {
641
+ return fail ( 'expected XLIFF to be valid' ) ;
642
+ }
643
+ const result = parser . parse ( '/some/file.xlf' , XLIFF , hint ) ;
644
+ expect ( result . locale ) . toEqual ( 'de ' ) ;
645
+ } ) ;
566
646
567
647
it ( 'should return an undefined locale if there is no locale in the file' , ( ) => {
568
648
const XLIFF = `
@@ -1005,6 +1085,62 @@ describe('Xliff1TranslationParser', () => {
1005
1085
. toEqual ( ɵmakeParsedTranslation ( [ 'Weiter' ] ) ) ;
1006
1086
} ) ;
1007
1087
1088
+ it ( 'should merge messages from each `<file>` element' , ( ) => {
1089
+ /**
1090
+ * Source HTML:
1091
+ *
1092
+ * ```
1093
+ * <div i18n>translatable attribute</div>
1094
+ * ```
1095
+ *
1096
+ * ```
1097
+ * <div i18n>translatable element <b>with placeholders</b> {{ interpolation}}</div>
1098
+ * ```
1099
+ */
1100
+ const XLIFF = `
1101
+ <xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
1102
+ <file source-language="en" target-language="fr" datatype="plaintext" original="file-1">
1103
+ <body>
1104
+ <trans-unit id="1933478729560469763" datatype="html">
1105
+ <source>translatable attribute</source>
1106
+ <target>etubirtta elbatalsnart</target>
1107
+ <context-group purpose="location">
1108
+ <context context-type="sourcefile">file.ts</context>
1109
+ <context context-type="linenumber">1</context>
1110
+ </context-group>
1111
+ </trans-unit>
1112
+ </body>
1113
+ </file>
1114
+ <file source-language="en" target-language="fr" datatype="plaintext" original="file-2">
1115
+ <body>
1116
+ <trans-unit id="5057824347511785081" datatype="html">
1117
+ <source>translatable element <x id="START_BOLD_TEXT" ctype="b"/>with placeholders<x id="CLOSE_BOLD_TEXT" ctype="b"/> <x id="INTERPOLATION"/></source>
1118
+ <target><x id="INTERPOLATION"/> tnemele elbatalsnart <x id="START_BOLD_TEXT" ctype="x-b"/>sredlohecalp htiw<x id="CLOSE_BOLD_TEXT" ctype="x-b"/></target>
1119
+ <context-group purpose="location">
1120
+ <context context-type="sourcefile">file.ts</context>
1121
+ <context context-type="linenumber">2</context>
1122
+ </context-group>
1123
+ </trans-unit>
1124
+ </body>
1125
+ </file>
1126
+ </xliff>` ;
1127
+ const parser = new Xliff1TranslationParser ( ) ;
1128
+ const hint = parser . canParse ( '/some/file.xlf' , XLIFF ) ;
1129
+ if ( ! hint ) {
1130
+ return fail ( 'expected XLIFF to be valid' ) ;
1131
+ }
1132
+ const result = parser . parse ( '/some/file.xlf' , XLIFF , hint ) ;
1133
+
1134
+ expect ( result . translations [ ɵcomputeMsgId ( 'translatable attribute' ) ] )
1135
+ . toEqual ( ɵmakeParsedTranslation ( [ 'etubirtta elbatalsnart' ] ) ) ;
1136
+ expect (
1137
+ result . translations [ ɵcomputeMsgId (
1138
+ 'translatable element {$START_BOLD_TEXT}with placeholders{$LOSE_BOLD_TEXT} {$INTERPOLATION}' ) ] )
1139
+ . toEqual ( ɵmakeParsedTranslation (
1140
+ [ '' , ' tnemele elbatalsnart ' , 'sredlohecalp htiw' , '' ] ,
1141
+ [ 'INTERPOLATION' , 'START_BOLD_TEXT' , 'CLOSE_BOLD_TEXT' ] ) ) ;
1142
+ } ) ;
1143
+
1008
1144
describe ( '[structure errors]' , ( ) => {
1009
1145
it ( 'should provide a diagnostic error when a trans-unit has no translation' , ( ) => {
1010
1146
const XLIFF = `
0 commit comments