Skip to content

Commit

Permalink
feat(compiler): Implement i18n XLIFF 2.0 serializer (#14185)
Browse files Browse the repository at this point in the history
- Ensure that the result passes OASIS XLIFF 2.0 schema validation
- Use <ph/> for self-closing placeholder tags
- Use <pc></pc> for other placeholder tags
- Check for the correct XLIFF file version
- Add ICU support

fixes #11735
  • Loading branch information
Panuruj Khambanonda (PK) authored and mhevery committed Apr 21, 2017
1 parent 4f172b0 commit a7d8edd
Show file tree
Hide file tree
Showing 7 changed files with 761 additions and 6 deletions.
33 changes: 33 additions & 0 deletions packages/compiler-cli/integrationtest/test/i18n_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,32 @@ const EXPECTED_XLIFF = `<?xml version="1.0" encoding="UTF-8" ?>
</xliff>
`;

const EXPECTED_XLIFF2 = `<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="2.0" xmlns="urn:oasis:names:tc:xliff:document:2.0" srcLang="en">
<file original="ng.template" id="ngi18n">
<unit id="8136548302122759730">
<notes>
<note category="description">desc</note>
<note category="meaning">meaning</note>
</notes>
<segment>
<source>translate me</source>
</segment>
</unit>
<unit id="3492007542396725315">
<segment>
<source>Welcome</source>
</segment>
</unit>
<unit id="3772663375917578720">
<segment>
<source>other-3rdP-component</source>
</segment>
</unit>
</file>
</xliff>
`;

describe('template i18n extraction output', () => {
const outDir = '';
const genDir = 'out';
Expand All @@ -81,6 +107,13 @@ describe('template i18n extraction output', () => {
expect(xlf).toEqual(EXPECTED_XLIFF);
});

it('should extract i18n messages as xliff version 2.0', () => {
const xlfOutput = path.join(outDir, 'messages.xliff2.xlf');
expect(fs.existsSync(xlfOutput)).toBeTruthy();
const xlf = fs.readFileSync(xlfOutput, {encoding: 'utf-8'});
expect(xlf).toEqual(EXPECTED_XLIFF2);
});

it('should not emit js', () => {
const genOutput = path.join(genDir, '');
expect(fs.existsSync(genOutput)).toBeFalsy();
Expand Down
26 changes: 20 additions & 6 deletions packages/compiler-cli/src/extractor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export class Extractor {
const promiseBundle = this.extractBundle();

return promiseBundle.then(bundle => {
const content = this.serialize(bundle, ext);
const content = this.serialize(bundle, formatName);
const dstFile = outFile || `messages.${ext}`;
const dstPath = path.join(this.options.genDir, dstFile);
this.host.writeFile(dstPath, content, false);
Expand All @@ -48,14 +48,20 @@ export class Extractor {
return this.ngExtractor.extract(files);
}

serialize(bundle: compiler.MessageBundle, ext: string): string {
serialize(bundle: compiler.MessageBundle, formatName: string): string {
const format = formatName.toLowerCase();
let serializer: compiler.Serializer;

switch (ext) {
switch (format) {
case 'xmb':
serializer = new compiler.Xmb();
break;
case 'xliff2':
case 'xlf2':
serializer = new compiler.Xliff2();
break;
case 'xlf':
case 'xliff':
default:
serializer = new compiler.Xliff();
}
Expand All @@ -66,10 +72,18 @@ export class Extractor {
getExtension(formatName: string): string {
const format = (formatName || 'xlf').toLowerCase();

if (format === 'xmb') return 'xmb';
if (format === 'xlf' || format === 'xlif' || format === 'xliff') return 'xlf';
switch (format) {
case 'xmb':
return 'xmb';
case 'xlf':
case 'xlif':
case 'xliff':
case 'xlf2':
case 'xliff2':
return 'xlf';
}

throw new Error('Unsupported format "${formatName}"');
throw new Error(`Unsupported format "${formatName}"`);
}

static create(
Expand Down
4 changes: 4 additions & 0 deletions packages/compiler/src/i18n/i18n_html_parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {ParseTreeResult} from '../ml_parser/parser';
import {mergeTranslations} from './extractor_merger';
import {Serializer} from './serializers/serializer';
import {Xliff} from './serializers/xliff';
import {Xliff2} from './serializers/xliff2';
import {Xmb} from './serializers/xmb';
import {Xtb} from './serializers/xtb';
import {TranslationBundle} from './translation_bundle';
Expand Down Expand Up @@ -62,6 +63,9 @@ function createSerializer(format?: string): Serializer {
return new Xmb();
case 'xtb':
return new Xtb();
case 'xliff2':
case 'xlf2':
return new Xliff2();
case 'xliff':
case 'xlf':
default:
Expand Down
1 change: 1 addition & 0 deletions packages/compiler/src/i18n/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ export {I18NHtmlParser} from './i18n_html_parser';
export {MessageBundle} from './message_bundle';
export {Serializer} from './serializers/serializer';
export {Xliff} from './serializers/xliff';
export {Xliff2} from './serializers/xliff2';
export {Xmb} from './serializers/xmb';
export {Xtb} from './serializers/xtb';
Loading

0 comments on commit a7d8edd

Please sign in to comment.