From c2953818a4010de1707f4407d8ce74ed57ba1602 Mon Sep 17 00:00:00 2001 From: Markus Henseler Date: Fri, 6 May 2022 01:02:51 +0200 Subject: [PATCH 1/4] ApplyStudioProjectTemplate: ApplyTemplateOptions.Merge -> Prepend/Append for TranslationProviders and Termbases --- .../ApplyStudioProjectTemplateAction.cs | 26 +++++++------- .../ApplyTemplateForm.Designer.cs | 35 +++++++++++-------- .../ApplyTemplateForm.cs | 27 ++++++++------ .../ApplyTemplateOptions.cs | 11 ++++++ 4 files changed, 63 insertions(+), 36 deletions(-) diff --git a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs index 3d82fe0e78..dc85896fef 100644 --- a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs +++ b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs @@ -162,10 +162,10 @@ protected override void Execute() { // Update the "all languages" node TranslationProviderConfiguration sourceProviderConfig = sourceProject.GetTranslationProviderConfiguration(); - if (selectedTemplate.TranslationProvidersAllLanguages == ApplyTemplateOptions.Merge) + if (selectedTemplate.TranslationProvidersAllLanguages != ApplyTemplateOptions.Overwrite) { TranslationProviderConfiguration targetProviderConfig = targetProject.GetTranslationProviderConfiguration(); - MergeTranslationProviders(sourceProviderConfig, targetProviderConfig); + MergeTranslationProviders(sourceProviderConfig, targetProviderConfig, selectedTemplate.TranslationProvidersAllLanguages); ValidateTranslationProviderConfiguration(targetProviderConfig); targetProject.UpdateTranslationProviderConfiguration(targetProviderConfig); } @@ -196,10 +196,10 @@ protected override void Execute() { // Copy translation providers TranslationProviderConfiguration sourceProviderConfig = sourceProject.GetTranslationProviderConfiguration(sourceTargetLanguage); - if (selectedTemplate.TranslationProvidersSpecificLanguages == ApplyTemplateOptions.Merge) + if (selectedTemplate.TranslationProvidersSpecificLanguages != ApplyTemplateOptions.Overwrite) { TranslationProviderConfiguration targetProviderConfig = targetProject.GetTranslationProviderConfiguration(targetTargetLanguage); - MergeTranslationProviders(sourceProviderConfig, targetProviderConfig); + MergeTranslationProviders(sourceProviderConfig, targetProviderConfig, selectedTemplate.TranslationProvidersSpecificLanguages); ValidateTranslationProviderConfiguration(targetProviderConfig); targetProject.UpdateTranslationProviderConfiguration(targetTargetLanguage, targetProviderConfig); } @@ -267,16 +267,16 @@ protected override void Execute() var sourceTermbaseConfig = sourceProject.GetTermbaseConfiguration(); var targetTermbaseConfig = targetProject.GetTermbaseConfiguration(); - if (selectedTemplate.TerminologyTermbases == ApplyTemplateOptions.Merge) + if (selectedTemplate.TerminologyTermbases != ApplyTemplateOptions.Overwrite) { - MergeTermbases(sourceTermbaseConfig, targetTermbaseConfig); + MergeTermbases(sourceTermbaseConfig, targetTermbaseConfig, selectedTemplate.TerminologyTermbases); } else { targetTermbaseConfig.TermbaseServerUri = sourceTermbaseConfig.TermbaseServerUri; targetTermbaseConfig.Termbases.Clear(); targetTermbaseConfig.LanguageIndexes.Clear(); - MergeTermbases(sourceTermbaseConfig, targetTermbaseConfig); + MergeTermbases(sourceTermbaseConfig, targetTermbaseConfig, ApplyTemplateOptions.Merge); } // Updating with zero termbases throws an exception @@ -482,7 +482,7 @@ protected override void Execute() try { var project = typeof(FileBasedProject).GetField("_project", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(targetProject); - project.GetType().GetMethod("UpdateServerProjectSettings").Invoke(project, new object[] { false }); + project.GetType().GetMethod("UpdateServerProjectSettings")?.Invoke(project, new object[] { false }); } catch (Exception e) { @@ -565,10 +565,10 @@ private void CopySettingsGroup(ISettingsBundle sourceSettings, ISettingsBundle t /// /// The source provider configuration. /// The target provider configuration. - private void MergeTranslationProviders(TranslationProviderConfiguration sourceProviderConfig, TranslationProviderConfiguration targetProviderConfig) + private void MergeTranslationProviders(TranslationProviderConfiguration sourceProviderConfig, TranslationProviderConfiguration targetProviderConfig, ApplyTemplateOptions mergeType) { // Remember where we're going to insert the translation providers - var indexToInsert = 0; + var indexToInsert = mergeType == ApplyTemplateOptions.Merge ? 0 : targetProviderConfig.Entries.Count; // Look at each translation provider in the source project foreach (var sourceCascadeEntry in sourceProviderConfig.Entries) @@ -589,8 +589,10 @@ private void MergeTranslationProviders(TranslationProviderConfiguration sourcePr /// /// The source terminology database configuration. /// The target terminology database configuration. - private void MergeTermbases(TermbaseConfiguration sourceTermbaseConfig, TermbaseConfiguration targetTermbaseConfig) + private void MergeTermbases(TermbaseConfiguration sourceTermbaseConfig, TermbaseConfiguration targetTermbaseConfig, ApplyTemplateOptions mergeType) { + var indexToInsert = mergeType == ApplyTemplateOptions.Merge ? targetTermbaseConfig.Termbases.Count : 0; + // Look at each termbase in the source project foreach (var sourceTermbase in sourceTermbaseConfig.Termbases) { @@ -647,7 +649,7 @@ private void MergeTermbases(TermbaseConfiguration sourceTermbaseConfig, Termbase // If we didn't find the current termbase then add it to the target project if (!foundEntry) { - targetTermbaseConfig.Termbases.Add(sourceTermbase); + targetTermbaseConfig.Termbases.Insert(indexToInsert, sourceTermbase); } } diff --git a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.Designer.cs b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.Designer.cs index 0a73d1c422..da7280f001 100644 --- a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.Designer.cs +++ b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.Designer.cs @@ -104,7 +104,7 @@ private void InitializeComponent() this.TranslationProvidersGroup.Size = new System.Drawing.Size(285, 84); this.TranslationProvidersGroup.TabIndex = 1; this.TranslationProvidersGroup.TabStop = false; - this.TranslationProvidersGroup.Text = "Translation Memory and Automated Translation"; + this.TranslationProvidersGroup.Text = "Translation Providers (TMs, MTs ...)"; // // TranslationProviderSpecificLanguagesLabel // @@ -124,16 +124,17 @@ private void InitializeComponent() this.TranslationProvidersSpecificLanguages.FormattingEnabled = true; this.TranslationProvidersSpecificLanguages.Items.AddRange(new object[] { "Keep", - "Merge", - "Overwrite"}); + "Prepend", + "Overwrite", + "Append"}); this.TranslationProvidersSpecificLanguages.Location = new System.Drawing.Point(194, 55); this.TranslationProvidersSpecificLanguages.Margin = new System.Windows.Forms.Padding(8, 4, 8, 4); this.TranslationProvidersSpecificLanguages.Name = "TranslationProvidersSpecificLanguages"; this.TranslationProvidersSpecificLanguages.Size = new System.Drawing.Size(80, 21); this.TranslationProvidersSpecificLanguages.TabIndex = 3; this.TranslationProvidersSpecificLanguages.Tag = "Translation Providers Specific Languages"; - this.FormToolTip.SetToolTip(this.TranslationProvidersSpecificLanguages, "Select the behaviour for applying the Translation Provider settings to specific l" + - "anguage pairs\r\n\r\n"); + this.FormToolTip.SetToolTip(this.TranslationProvidersSpecificLanguages, "Select how the template's Translation Providers are applied to specific l" + + "anguage pairs Translation Providers' list"); this.TranslationProvidersSpecificLanguages.SelectedIndexChanged += new System.EventHandler(this.TranslationProvidersSpecificLanguages_SelectedIndexChanged); this.TranslationProvidersSpecificLanguages.MouseEnter += new System.EventHandler(this.ControlMouseEnter); // @@ -155,16 +156,17 @@ private void InitializeComponent() this.TranslationProvidersAllLanguages.FormattingEnabled = true; this.TranslationProvidersAllLanguages.Items.AddRange(new object[] { "Keep", - "Merge", - "Overwrite"}); + "Prepend", + "Overwrite", + "Append"}); this.TranslationProvidersAllLanguages.Location = new System.Drawing.Point(194, 26); this.TranslationProvidersAllLanguages.Margin = new System.Windows.Forms.Padding(8, 4, 8, 4); this.TranslationProvidersAllLanguages.Name = "TranslationProvidersAllLanguages"; this.TranslationProvidersAllLanguages.Size = new System.Drawing.Size(80, 21); this.TranslationProvidersAllLanguages.TabIndex = 1; this.TranslationProvidersAllLanguages.Tag = "Translation Providers All Languages"; - this.FormToolTip.SetToolTip(this.TranslationProvidersAllLanguages, "Select the behaviour for applying the Translation Provider settings to all langua" + - "ge pairs"); + this.FormToolTip.SetToolTip(this.TranslationProvidersAllLanguages, "Select how the template's Translation Providers should be applied to all langua" + + "ge pairs Translation Providers' list"); this.TranslationProvidersAllLanguages.SelectedIndexChanged += new System.EventHandler(this.TranslationProvidersAllLanguages_SelectedIndexChanged); this.TranslationProvidersAllLanguages.MouseEnter += new System.EventHandler(this.ControlMouseEnter); // @@ -181,6 +183,10 @@ private void InitializeComponent() this.TranslationMemoriesGroup.TabIndex = 2; this.TranslationMemoriesGroup.TabStop = false; this.TranslationMemoriesGroup.Text = "Translation Memory settings"; + this.TranslationMemoriesGroup.Tag = "Translation Memory settings (ie. search, penalties, filters...) "; + this.FormToolTip.SetToolTip(this.TranslationMemoriesGroup, "Select how the template's Translation Memory settings should be applied to the project."); + this.TranslationMemoriesGroup.MouseEnter += new System.EventHandler(this.ControlMouseEnter); this.EditTemplatesButton.MouseEnter += new System.EventHandler(this.ControlMouseEnter); + // // TranslationMemoriesSpecificLanguagesLabel // @@ -208,7 +214,7 @@ private void InitializeComponent() this.TranslationMemoriesSpecificLanguages.TabIndex = 3; this.TranslationMemoriesSpecificLanguages.Tag = "Translation Memories Specific Languages"; this.FormToolTip.SetToolTip(this.TranslationMemoriesSpecificLanguages, "Select the behaviour for applying the Translation Memory settings to specific lan" + - "guage pairs\r\n"); + "guage pairs (ie. search, penalties, filters...)"); this.TranslationMemoriesSpecificLanguages.SelectedIndexChanged += new System.EventHandler(this.TranslationMemoriesSpecificLanguages_SelectedIndexChanged); this.TranslationMemoriesSpecificLanguages.MouseEnter += new System.EventHandler(this.ControlMouseEnter); // @@ -238,7 +244,7 @@ private void InitializeComponent() this.TranslationMemoriesAllLanguages.TabIndex = 1; this.TranslationMemoriesAllLanguages.Tag = "Translation Memories All Languages"; this.FormToolTip.SetToolTip(this.TranslationMemoriesAllLanguages, "Select the behaviour for applying the Translation Memory settings to all language" + - " pairs\r\n"); + " pairs (ie. search, penalties, filters...)"); this.TranslationMemoriesAllLanguages.SelectedIndexChanged += new System.EventHandler(this.TranslationMemoriesAllLanguages_SelectedIndexChanged); this.TranslationMemoriesAllLanguages.MouseEnter += new System.EventHandler(this.ControlMouseEnter); // @@ -303,15 +309,16 @@ private void InitializeComponent() this.TerminologyTermbases.FormattingEnabled = true; this.TerminologyTermbases.Items.AddRange(new object[] { "Keep", - "Merge", - "Overwrite"}); + "Append", + "Overwrite", + "Prepend"}); this.TerminologyTermbases.Location = new System.Drawing.Point(194, 26); this.TerminologyTermbases.Margin = new System.Windows.Forms.Padding(8, 4, 8, 4); this.TerminologyTermbases.Name = "TerminologyTermbases"; this.TerminologyTermbases.Size = new System.Drawing.Size(80, 21); this.TerminologyTermbases.TabIndex = 1; this.TerminologyTermbases.Tag = "Terminology Termbases"; - this.FormToolTip.SetToolTip(this.TerminologyTermbases, "Select the behaviour for applying the Terminology Termbases"); + this.FormToolTip.SetToolTip(this.TerminologyTermbases, "Select how the template's Terminology Termbases should be applied to the project"); this.TerminologyTermbases.SelectedIndexChanged += new System.EventHandler(this.TerminologyTermbases_SelectedIndexChanged); this.TerminologyTermbases.MouseEnter += new System.EventHandler(this.ControlMouseEnter); // diff --git a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs index b95d36591c..624558b5da 100644 --- a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs +++ b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs @@ -226,11 +226,15 @@ private void SelectedTemplate_SelectedIndexChanged(object sender, EventArgs e) if (selectedTemplate != null) { - TranslationProvidersAllLanguages.SelectedItem = selectedTemplate.TranslationProvidersAllLanguages.ToString(); - TranslationProvidersSpecificLanguages.SelectedItem = selectedTemplate.TranslationProvidersSpecificLanguages.ToString(); + int num = (int)selectedTemplate.TranslationProvidersAllLanguages; + TranslationProvidersAllLanguages.SelectedIndex = num; + TranslationProvidersSpecificLanguages.SelectedIndex = (int)selectedTemplate.TranslationProvidersSpecificLanguages; + //TranslationProvidersAllLanguages.SelectedItem = selectedTemplate.TranslationProvidersAllLanguages.ToString(); + //TranslationProvidersSpecificLanguages.SelectedItem = selectedTemplate.TranslationProvidersSpecificLanguages.ToString(); TranslationMemoriesAllLanguages.SelectedItem = selectedTemplate.TranslationMemoriesAllLanguages.ToString(); TranslationMemoriesSpecificLanguages.SelectedItem = selectedTemplate.TranslationMemoriesSpecificLanguages.ToString(); - TerminologyTermbases.SelectedItem = selectedTemplate.TerminologyTermbases.ToString(); + TerminologyTermbases.SelectedIndex = (int)selectedTemplate.TerminologyTermbases; + //TerminologyTermbases.SelectedItem = selectedTemplate.TerminologyTermbases.ToString(); TerminologySearchSettings.SelectedItem = selectedTemplate.TerminologySearchSettings.ToString(); TranslationQualityAssessment.SelectedItem = selectedTemplate.TranslationQualityAssessment.ToString(); BatchTasksAllLanguages.SelectedItem = selectedTemplate.BatchTasksAllLanguages.ToString(); @@ -289,8 +293,9 @@ private void TranslationProvidersAllLanguages_SelectedIndexChanged(object sender if (SelectedTemplate.SelectedItem is ApplyTemplate applyTemplate) { applyTemplate.TranslationProvidersAllLanguages = - (ApplyTemplateOptions)Enum.Parse(typeof(ApplyTemplateOptions), - TranslationProvidersAllLanguages.SelectedItem.ToString()); + (ApplyTemplateOptions)TranslationProvidersAllLanguages.SelectedIndex; + //Enum.Parse(typeof(ApplyTemplateOptions), + //TranslationProvidersAllLanguages.SelectedItem.ToString()); } CheckChanged(); } @@ -305,8 +310,9 @@ private void TranslationProvidersSpecificLanguages_SelectedIndexChanged(object s if (SelectedTemplate.SelectedItem is ApplyTemplate applyTemplate) { applyTemplate.TranslationProvidersSpecificLanguages = - (ApplyTemplateOptions)Enum.Parse(typeof(ApplyTemplateOptions), - TranslationProvidersSpecificLanguages.SelectedItem.ToString()); + (ApplyTemplateOptions)TranslationProvidersSpecificLanguages.SelectedIndex; + //Enum.Parse(typeof(ApplyTemplateOptions), + // TranslationProvidersSpecificLanguages.SelectedItem.ToString()); } CheckChanged(); @@ -323,7 +329,7 @@ private void TranslationMemoriesAllLanguages_SelectedIndexChanged(object sender, { applyTemplate.TranslationMemoriesAllLanguages = (ApplyTemplateOptions)Enum.Parse(typeof(ApplyTemplateOptions), - TranslationMemoriesAllLanguages.SelectedItem.ToString()); + TranslationMemoriesAllLanguages.SelectedItem.ToString()); } CheckChanged(); } @@ -354,8 +360,9 @@ private void TerminologyTermbases_SelectedIndexChanged(object sender, EventArgs if (SelectedTemplate.SelectedItem is ApplyTemplate applyTemplate) { applyTemplate.TerminologyTermbases = - (ApplyTemplateOptions)Enum.Parse(typeof(ApplyTemplateOptions), - TerminologyTermbases.SelectedItem.ToString()); + (ApplyTemplateOptions)TerminologyTermbases.SelectedIndex; + //Enum.Parse(typeof(ApplyTemplateOptions), + //TerminologyTermbases.SelectedItem.ToString()); } CheckChanged(); } diff --git a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateOptions.cs b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateOptions.cs index b337a0ac84..56853c90b5 100644 --- a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateOptions.cs +++ b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateOptions.cs @@ -25,5 +25,16 @@ public enum ApplyTemplateOptions /// Overwrite the current settings with the settings from the template /// Overwrite = 2, + + /// + /// Alternative Merge of settings from the template with the existing settings + /// + /// + /// This is to not to break older versions of settings file ASPT.xml. + /// ApplyTemplateForm actually uses Append and Prepend for Merge/AltMerge. + /// For translation providers the old Merge matches Prepend, + /// for Termbases the old Merge matches Append. + /// + AltMerge = 3 } } From f8add68c35a33535ade0250d4fd822694e5c7d2a Mon Sep 17 00:00:00 2001 From: Markus Henseler Date: Fri, 6 May 2022 01:44:58 +0200 Subject: [PATCH 2/4] small edit in ApplyTemplateForm.SelectedTemplate_SelectedIndexChanged --- .../ApplyTemplateForm.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs index 624558b5da..98fc080afd 100644 --- a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs +++ b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyTemplateForm.cs @@ -226,8 +226,7 @@ private void SelectedTemplate_SelectedIndexChanged(object sender, EventArgs e) if (selectedTemplate != null) { - int num = (int)selectedTemplate.TranslationProvidersAllLanguages; - TranslationProvidersAllLanguages.SelectedIndex = num; + TranslationProvidersAllLanguages.SelectedIndex = (int)selectedTemplate.TranslationProvidersAllLanguages; TranslationProvidersSpecificLanguages.SelectedIndex = (int)selectedTemplate.TranslationProvidersSpecificLanguages; //TranslationProvidersAllLanguages.SelectedItem = selectedTemplate.TranslationProvidersAllLanguages.ToString(); //TranslationProvidersSpecificLanguages.SelectedItem = selectedTemplate.TranslationProvidersSpecificLanguages.ToString(); From 177631cfe4b03114ef5288d7da04c1eb761530cd Mon Sep 17 00:00:00 2001 From: Markus Henseler Date: Fri, 6 May 2022 13:02:54 +0200 Subject: [PATCH 3/4] resolving conflicts --- .../ApplyStudioProjectTemplateAction.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs index dc85896fef..234c21bb8a 100644 --- a/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs +++ b/ApplyStudioProjectTemplate/Sdl.Community.ApplyStudioProjectTemplate/ApplyStudioProjectTemplateAction.cs @@ -269,6 +269,15 @@ protected override void Execute() if (selectedTemplate.TerminologyTermbases != ApplyTemplateOptions.Overwrite) { + if (targetTermbaseConfig.TermbaseServerUri is null) + { + targetTermbaseConfig.TermbaseServerUri = sourceTermbaseConfig.TermbaseServerUri; + } + if (!targetTermbaseConfig.Termbases.Any()) + { + targetTermbaseConfig.Termbases?.AddRange(sourceTermbaseConfig.Termbases); + } + MergeTermbases(sourceTermbaseConfig, targetTermbaseConfig, selectedTemplate.TerminologyTermbases); } else @@ -482,7 +491,11 @@ protected override void Execute() try { var project = typeof(FileBasedProject).GetField("_project", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(targetProject); - project.GetType().GetMethod("UpdateServerProjectSettings")?.Invoke(project, new object[] { false }); + var updateServerMethod = project.GetType().GetMethod("ExecuteOperation"); + //For GS projects + updateServerMethod?.Invoke(project, new object[] { "UpdateServerProjectSettingsOperation", new object[] { true } }); + //For LC projects + updateServerMethod?.Invoke(project, new object[] { "SynchronizeServerProjectDataOperation", new object[] { null } }); } catch (Exception e) { From f71bd1919e5cd4cded39352dbe44a763014bb9d1 Mon Sep 17 00:00:00 2001 From: Markus Henseler Date: Fri, 17 Jun 2022 16:53:05 +0200 Subject: [PATCH 4/4] make non-breaking spaces (nbsp) changes visible --- .../Comparer/TextComparer/TextComparer.cs | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/SdlXliff Compare/Sdl.Community.XliffCompare.Core/Comparer/TextComparer/TextComparer.cs b/SdlXliff Compare/Sdl.Community.XliffCompare.Core/Comparer/TextComparer/TextComparer.cs index 766505cbef..0ed17fa0ec 100644 --- a/SdlXliff Compare/Sdl.Community.XliffCompare.Core/Comparer/TextComparer/TextComparer.cs +++ b/SdlXliff Compare/Sdl.Community.XliffCompare.Core/Comparer/TextComparer/TextComparer.cs @@ -332,13 +332,19 @@ internal static WordsCollection Parse(List xSegmentSect while (curPos < xSegmentSection.Content.Length) { var prevPos = curPos; - while (curPos < xSegmentSection.Content.Length && - (char.IsControl(xSegmentSection.Content[curPos]) - || char.IsWhiteSpace(xSegmentSection.Content[curPos]))) - { - curPos++; - } - prefix += xSegmentSection.Content.Substring(prevPos, curPos - prevPos); + if (xSegmentSection.Content[curPos] == '\xa0') // make nbsp a word + { + words.Add(new Word("\xa0", string.Empty, string.Empty)); + curPos++; + continue; + } + while (curPos < xSegmentSection.Content.Length && + (char.IsControl(xSegmentSection.Content[curPos]) + || char.IsWhiteSpace(xSegmentSection.Content[curPos]))) + { + curPos++; + } + prefix += xSegmentSection.Content.Substring(prevPos, curPos - prevPos); if (curPos == xSegmentSection.Content.Length) { @@ -362,7 +368,8 @@ internal static WordsCollection Parse(List xSegmentSect prevPos = curPos; while (curPos < xSegmentSection.Content.Length && - (char.IsControl(xSegmentSection.Content[curPos]) || + xSegmentSection.Content[curPos] != '\xa0' && // stop at nbsp + (char.IsControl(xSegmentSection.Content[curPos]) || char.IsWhiteSpace(xSegmentSection.Content[curPos]))) { curPos++;