From d529b55651739219bbd80c2630defe9a55d149f5 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Fri, 29 Nov 2019 17:52:06 +0000 Subject: [PATCH] fix(ivy): i18n - correctly parse XLIFF placeholders (#34155) The ViewEngine translation extractor does not convert `-` to `_` for placeholders that represent custom elements. For example `` gets converted to placeholders like `START_TAG_APP-COMPONENT`. In `$localize` placeholders are expected to be snake-case, not kebab-case. So we must normalize them when parsing a translation file that might have been created via the View Engine translation extractor. The `$localize` extraction code will normalize these placeholders when creating translation files in the first place. Fixes #34151 PR Close #34155 --- .../target_message_renderer.ts | 2 ++ .../xliff1_translation_parser_spec.ts | 34 ++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/localize/src/tools/src/translate/translation_files/message_serialization/target_message_renderer.ts b/packages/localize/src/tools/src/translate/translation_files/message_serialization/target_message_renderer.ts index 3db16dea25..449dfaf712 100644 --- a/packages/localize/src/tools/src/translate/translation_files/message_serialization/target_message_renderer.ts +++ b/packages/localize/src/tools/src/translate/translation_files/message_serialization/target_message_renderer.ts @@ -35,7 +35,9 @@ export class TargetMessageRenderer implements MessageRenderer<ɵParsedTranslatio this.icuDepth--; this.text('}'); } + private normalizePlaceholderName(name: string) { return name.replace(/-/g, '_'); } private renderPlaceholder(name: string) { + name = this.normalizePlaceholderName(name); if (this.icuDepth > 0) { this.text(`{${name}}`); } else { diff --git a/packages/localize/src/tools/test/translate/translation_files/translation_parsers/xliff1_translation_parser_spec.ts b/packages/localize/src/tools/test/translate/translation_files/translation_parsers/xliff1_translation_parser_spec.ts index 4a4c2268a7..594d2fabc7 100644 --- a/packages/localize/src/tools/test/translate/translation_files/translation_parsers/xliff1_translation_parser_spec.ts +++ b/packages/localize/src/tools/test/translate/translation_files/translation_parsers/xliff1_translation_parser_spec.ts @@ -88,7 +88,7 @@ describe('Xliff1TranslationParser', () => { * Source HTML: * * ``` - *
translatable element >with placeholders {{ interpolation}}
+ *
translatable element with placeholders {{ interpolation}}
* ``` */ const XLIFF = ` @@ -117,6 +117,38 @@ describe('Xliff1TranslationParser', () => { ['INTERPOLATION', 'START_BOLD_TEXT', 'CLOSE_BOLD_TEXT'])); }); + it('should extract translations with placeholders containing hyphens', () => { + /** + * Source HTML: + * + * ``` + *
Welcome
+ * ``` + */ + const XLIFF = ` + + + + + Welcome + + src/app/app.component.html + 1 + + Translate + + + + `; + const parser = new Xliff1TranslationParser(); + const result = parser.parse('/some/file.xlf', XLIFF); + const id = + ɵcomputeMsgId('{$START_TAG_APP_MY_COMPONENT}{$CLOSE_TAG_APP_MY_COMPONENT} Welcome'); + expect(result.translations[id]).toEqual(ɵmakeParsedTranslation(['', '', ' Translate'], [ + 'START_TAG_APP_MY_COMPONENT', 'CLOSE_TAG_APP_MY_COMPONENT' + ])); + }); + it('should extract translations with simple ICU expressions', () => { /** * Source HTML: