Skip to content

Commit

Permalink
fix: prevent generation of target node for updated source texts when …
Browse files Browse the repository at this point in the history
…newTranslationTargetsBlank=omit/true
  • Loading branch information
daniel-sc committed Sep 4, 2023
1 parent e5b007a commit 272090d
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 16 deletions.
111 changes: 98 additions & 13 deletions __tests__/merge.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ describe('merge', () => {
describe('xliff 1.2', () => {
test('should handle many units with fuzzy match performantly', () => {
const count = 1000;

function generateSourceUnit(n: number): string {
return `<trans-unit id="source-ID${n}" datatype="html"><source>source val ${n}</source></trans-unit>`;
}

function generateTargetUnit(n: number): string {
return `<trans-unit id="target-ID${n}" datatype="html"><source>target source val ${n}</source><target>target val</target></trans-unit>`;

}

const sourceFileContent = '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
Expand Down Expand Up @@ -490,15 +493,15 @@ describe('merge', () => {
' </file>\n' +
'</xliff>';
const excludeFileContent = ['<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" target-language="fr-ch" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val that is long enough</source>\n' +
' <target>target val</target>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>'];
' <file source-language="de" target-language="fr-ch" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val that is long enough</source>\n' +
' <target>target val</target>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>'];

const result = merge(sourceFileContent, destFileContent, {excludeFiles: excludeFileContent});

Expand Down Expand Up @@ -1090,7 +1093,7 @@ describe('merge', () => {
' </file>\n' +
'</xliff>'));
});
test('should add final node with filled target when newTranslationTargetsBlank=true and destination file is source language', () => {
test('should add final node with filled target when newTranslationTargetsBlank=true and destination file is source language', () => {
const sourceFileContent = '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="fr" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
Expand All @@ -1114,7 +1117,10 @@ describe('merge', () => {
' </file>\n' +
'</xliff>';

const result = merge(sourceFileContent, destFileContent, { newTranslationTargetsBlank: true, sourceLanguage: true });
const result = merge(sourceFileContent, destFileContent, {
newTranslationTargetsBlank: true,
sourceLanguage: true
});

expect(norm(result)).toEqual(norm('<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="fr" target-language="fr-ch" datatype="plaintext" original="ng2.template">\n' +
Expand All @@ -1131,6 +1137,82 @@ describe('merge', () => {
' </file>\n' +
'</xliff>'));
});
test('should trim existing without adding target when newTranslationTargetsBlank="omit"', () => {
const sourceFileContent = '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val</source>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>';
const destFileContent = '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" target-language="fr-ch" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val </source>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>';


const result = merge(sourceFileContent, destFileContent, {
newTranslationTargetsBlank: 'omit',
syncTargetsWithInitialState: true,
sourceLanguage: false
});

expect(norm(result)).toEqual(norm('<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" target-language="fr-ch" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val</source>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>'));
});
test('should trim existing without adding target when newTranslationTargetsBlank=true', () => {
const sourceFileContent = '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val</source>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>';
const destFileContent = '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" target-language="fr-ch" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val </source>\n' +
' <target state="new"></target>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>';


const result = merge(sourceFileContent, destFileContent, {
newTranslationTargetsBlank: true,
syncTargetsWithInitialState: true,
sourceLanguage: false
});

expect(norm(result)).toEqual(norm('<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">\n' +
' <file source-language="de" target-language="fr-ch" datatype="plaintext" original="ng2.template">\n' +
' <body>\n' +
' <trans-unit id="ID1" datatype="html">\n' +
' <source>source val</source>\n' +
' <target state="new"></target>\n' +
' </trans-unit>\n' +
' </body>\n' +
' </file>\n' +
'</xliff>'));
});
});

describe('xliff 2.0', () => {
Expand Down Expand Up @@ -1439,7 +1521,7 @@ describe('merge', () => {
'</xliff>'));
});

test('should add final node with filled target when newTranslationTargetsBlank=true and destination file is source language', () => {
test('should add final node with filled target when newTranslationTargetsBlank=true and destination file is source language', () => {
const sourceFileContent = '<xliff version="2.0" xmlns="urn:oasis:names:tc:xliff:document:2.0" srcLang="fr">\n' +
' <file original="ng.template" id="ngi18n">\n' +
' <unit id="ID1">\n' +
Expand All @@ -1465,7 +1547,10 @@ describe('merge', () => {
' </file>\n' +
'</xliff>';

const result = merge(sourceFileContent, destFileContent, { newTranslationTargetsBlank: true, sourceLanguage: true });
const result = merge(sourceFileContent, destFileContent, {
newTranslationTargetsBlank: true,
sourceLanguage: true
});

expect(norm(result)).toEqual(norm('<xliff version="2.0" xmlns="urn:oasis:names:tc:xliff:document:2.0" srcLang="fr" trgLang="fr-CH">\n' +
' <file original="ng.template" id="ngi18n">\n' +
Expand Down
8 changes: 5 additions & 3 deletions src/merge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ type MergeOptions = {
sourceLanguage?: boolean,
replaceApostrophe?: boolean,
newTranslationTargetsBlank?: boolean | 'omit',
/** For untranslated units with initial state (state="initial" / state="new"), a updated source will be copied into the target */
/** For untranslated units with initial state (state="initial" / state="new"), an updated source will be copied into the target (unless `newTranslationTargetsBlank='omit'/true`) */
syncTargetsWithInitialState?: boolean,
};

Expand Down Expand Up @@ -223,8 +223,10 @@ export function mergeWithMapping(inFilesContent: string | string[], destFileCont
if (options?.collapseWhitespace ?? true ? collapseWhitespace(destSourceText) !== collapseWhitespace(unitSourceText) : destSourceText !== unitSourceText) {
destSource.children = unitSource.children;
if (options?.sourceLanguage || (options?.syncTargetsWithInitialState === true && isUntranslated(destUnit, xliffVersion, destSourceText))) {
const targetElement = destTarget ?? createTargetElement(destUnit, xliffVersion);
targetElement!.children = unitSource.children;
if (destTarget || options?.newTranslationTargetsBlank !== 'omit') {
const targetElement = destTarget ?? createTargetElement(destUnit, xliffVersion);
targetElement!.children = unitSource.children;
}
}
updateFirstAndLastChild(destSource);
resetTranslationState(destUnit, xliffVersion, options);
Expand Down

0 comments on commit 272090d

Please sign in to comment.