Skip to content

Commit 0d8a961

Browse files
Multilingual XML FileType 3.1.2.1 (#1777)
- Updated the plugin to add prefix namespaces - Updated the plugin to handle language paths that start with predicates - Enhanced the ImportBatchTask so that subsegments from Placeholder Tags are always assigned the correct ParagraphUnitId.
1 parent 09e229b commit 0d8a961

File tree

11 files changed

+115
-23
lines changed

11 files changed

+115
-23
lines changed

Multilingual XML FileType/Multilingual.XML.FileType/BatchTasks/ExportBatchTask.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Xml;
1010
using Multilingual.XML.FileType.BatchTasks.Pages;
1111
using Multilingual.XML.FileType.BatchTasks.Settings;
12+
using Multilingual.XML.FileType.Extensions;
1213
using Multilingual.XML.FileType.FileType.Processors;
1314
using Multilingual.XML.FileType.FileType.Settings;
1415
using Multilingual.XML.FileType.Models;
@@ -220,6 +221,8 @@ public override void TaskComplete()
220221
outputDocument.Load(outputXmlReader);
221222

222223
var nsmgr = new XmlNamespaceManager(outputDocument.NameTable);
224+
outputDocument.AddAllNamespaces(nsmgr);
225+
223226
var namespaceUri = _defaultNamespaceHelper.GetXmlNameSpaceUri(
224227
multilingualFileInfo.MultilingualFilePath, multilingualFileInfo.FileEncoding);
225228
if (!string.IsNullOrEmpty(namespaceUri))
@@ -288,8 +291,8 @@ public override void TaskComplete()
288291
: multilingualFileInfo.TargetLanguage.XPath;
289292

290293

291-
var outputXmlNode = outputNode.SelectSingleNode(outputlanguagePath, nsmgr);
292-
var multilingualXmlNode = multilingualNode.SelectSingleNode(outputlanguagePath, nsmgr);
294+
var outputXmlNode = outputNode.SafeSelectSingleNode(outputlanguagePath, nsmgr);
295+
var multilingualXmlNode = multilingualNode.SafeSelectSingleNode(outputlanguagePath, nsmgr);
293296

294297
if (multilingualXmlNode == null)
295298
{

Multilingual XML FileType/Multilingual.XML.FileType/BatchTasks/ImportBatchTask.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,22 +276,32 @@ private List<IParagraphUnit> AlignParagraphUnits(IReadOnlyList<MultilingualParag
276276
// Target segmentation is unknown at this point.
277277
// TODO: investigate if we can run pretranslation task reverting the language direction
278278
for (var m = 0; m < paragraphUnitInfo.SegmentPairs.Count; m++)
279-
{
279+
{
280280
var originalSegmentPairInfo = paragraphUnitInfo.SegmentPairs[m];
281281
var segmentPairProperties = originalSegmentPairInfo.SegmentPair.Properties.Clone() as ISegmentPairProperties;
282282
var sourceSegment = _segmentBuilder.CreateSegment(segmentPairProperties);
283283
var targetSegment = sourceSegment.Clone() as ISegment;
284284

285285
foreach (var item in originalSegmentPairInfo.SegmentPair.Source)
286286
{
287+
if (item is IPlaceholderTag placeholder)
288+
{
289+
EnsureTagSubSegments(placeholder, paragraphUnitInfo);
290+
}
291+
287292
sourceSegment.Add(item.Clone() as IAbstractMarkupData);
288293
}
289294

290295
if (m == 0)
291296
{
292297
foreach (var item in updatedParagraphUnitInfo.ParagraphUnit.Source)
293298
{
294-
targetSegment.Add(item.Clone() as IAbstractMarkupData);
299+
if (item is IPlaceholderTag placeholder)
300+
{
301+
EnsureTagSubSegments(placeholder, paragraphUnitInfo);
302+
}
303+
304+
targetSegment.Add(item.Clone() as IAbstractMarkupData);
295305
}
296306
}
297307

@@ -400,7 +410,15 @@ private List<IParagraphUnit> AlignParagraphUnits(IReadOnlyList<MultilingualParag
400410
return paragraphUnits;
401411
}
402412

403-
private void UpdateSegments(IAbstractMarkupDataContainer container, IEnumerable<ISegmentPair> segmentPairs, bool isSource)
413+
private void EnsureTagSubSegments(IPlaceholderTag placeholder, ParagraphUnitInfo paragraphUnitInfo)
414+
{
415+
foreach (var subSegment in placeholder.SubSegments)
416+
{
417+
subSegment.ParagraphUnitId = new ParagraphUnitId(paragraphUnitInfo.ParagraphUnitId);
418+
}
419+
}
420+
421+
private void UpdateSegments(IAbstractMarkupDataContainer container, IEnumerable<ISegmentPair> segmentPairs, bool isSource)
404422
{
405423
for (var index = 0; index < container.Count; index++)
406424
{
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using System.Xml;
7+
8+
namespace Multilingual.XML.FileType.Extensions
9+
{
10+
public static class XMLDocumentExtensions
11+
{
12+
public static void AddAllNamespaces(this XmlDocument doc, XmlNamespaceManager nsmgr)
13+
{
14+
var root = doc.DocumentElement;
15+
if (root == null) return;
16+
17+
foreach (XmlAttribute attr in root.Attributes)
18+
{
19+
if (attr.Prefix == "xmlns")
20+
{
21+
nsmgr.AddNamespace(attr.LocalName, attr.Value);
22+
}
23+
else if (attr.Name == "xmlns")
24+
{
25+
nsmgr.AddNamespace(string.Empty, attr.Value); // default namespace
26+
}
27+
}
28+
}
29+
30+
public static XmlNode SafeSelectSingleNode(this XmlNode node, string path, XmlNamespaceManager nsmgr)
31+
{
32+
if (string.IsNullOrWhiteSpace(path))
33+
return null;
34+
35+
if (path.TrimStart().StartsWith("["))
36+
path = "(.)" + path; // parentheses make it valid for .NET XPath
37+
38+
return node.SelectSingleNode(path, nsmgr);
39+
}
40+
}
41+
}

Multilingual XML FileType/Multilingual.XML.FileType/Multilingual.XML.FileType.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFramework>net48</TargetFramework>
4-
<TradosFolder>C:\Program Files (x86)\Trados\Trados Studio\Studio18beta</TradosFolder>
4+
<TradosFolder>C:\Program Files (x86)\Trados\Trados Studio\Studio18</TradosFolder>
55
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
6-
<PluginDeploymentPath>$(AppData)\Trados\Trados Studio\18beta\Plugins</PluginDeploymentPath>
6+
<PluginDeploymentPath>$(AppData)\Trados\Trados Studio\18\Plugins</PluginDeploymentPath>
77
<UseWindowsForms>true</UseWindowsForms>
88
<UseWPF>true</UseWPF>
99
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>

Multilingual XML FileType/Multilingual.XML.FileType/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
// by using the '*' as shown below:
2929
// [assembly: AssemblyVersion("1.0.*")]
3030
[assembly: AssemblyVersion("3.0.0.0")]
31-
[assembly: AssemblyFileVersion("3.1.1.0")]
31+
[assembly: AssemblyFileVersion("3.1.2.1")]

Multilingual XML FileType/Multilingual.XML.FileType/Services/BilingualParser.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ public bool ParseNext()
177177

178178
_document.Load(_xmlReader);
179179
_nsmgr = new XmlNamespaceManager(_document.NameTable);
180+
_document.AddAllNamespaces(_nsmgr);
180181

181182
UpdateLanguageMappingSettings(_nsmgr);
182183

@@ -195,7 +196,7 @@ public bool ParseNext()
195196

196197
var xmlNode = nodes[index];
197198

198-
var sourceXmlNode = xmlNode.SelectSingleNode(_sourceLanguage.XPath, _nsmgr);
199+
var sourceXmlNode = xmlNode.SafeSelectSingleNode(_sourceLanguage.XPath, _nsmgr);
199200
var childNode = sourceXmlNode?.FirstChild;
200201
var isCdata = childNode?.NodeType == XmlNodeType.CDATA;
201202

@@ -237,7 +238,7 @@ private List<XmlNode> GetParagraphLevelCommentNodes(XmlNode xmlNode)
237238
var allSegmentCommentXmlNodes = new List<XmlNode>();
238239
foreach (var languageMappingLanguage in LanguageMappingSettings.LanguageMappingLanguages)
239240
{
240-
var languageXmlNode = xmlNode.SelectSingleNode(languageMappingLanguage.XPath, _nsmgr);
241+
var languageXmlNode = xmlNode.SafeSelectSingleNode(languageMappingLanguage.XPath, _nsmgr);
241242
var languageComments = languageXmlNode?.SelectNodes(".//" + CommentMappingSettings.CommentElementName, _nsmgr);
242243
if (languageComments != null)
243244
{

Multilingual XML FileType/Multilingual.XML.FileType/Services/BilingualWriter.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Sdl.FileTypeSupport.Framework.BilingualApi;
1313
using Sdl.FileTypeSupport.Framework.NativeApi;
1414
using Sdl.FileTypeSupport.Framework.IntegrationApi;
15+
using Multilingual.XML.FileType.Extensions;
1516

1617
namespace Multilingual.XML.FileType.Services
1718
{
@@ -167,8 +168,9 @@ public void SetFileProperties(IFileProperties fileInfo)
167168
_targetDocument.Load(_xmlReader);
168169

169170
_nsmgr = new XmlNamespaceManager(_targetDocument.NameTable);
171+
_targetDocument.AddAllNamespaces(_nsmgr);
170172

171-
if (_originalFileProperties.FileSnifferInfo != null && _originalFileProperties.FileSnifferInfo.MetaDataContainsKey(Constants.DefaultNamespace))
173+
if (_originalFileProperties.FileSnifferInfo != null && _originalFileProperties.FileSnifferInfo.MetaDataContainsKey(Constants.DefaultNamespace))
172174
{
173175
var namespaceUri = _originalFileProperties.FileSnifferInfo.GetMetaData(Constants.DefaultNamespace);
174176
if (!string.IsNullOrEmpty(namespaceUri))
@@ -439,7 +441,7 @@ private XmlNode GetXmlNode(bool isSource)
439441

440442
private XmlNode GetXmlUnitNode(XmlNode xmlUnit, string xPath)
441443
{
442-
var xmlNode = xmlUnit.SelectSingleNode(xPath, _nsmgr);
444+
var xmlNode = xmlUnit.SafeSelectSingleNode(xPath, _nsmgr);
443445
if (xmlNode == null)
444446
{
445447
xmlNode = _xmlNodeService.AddXmlNode(xmlUnit, xPath);

Multilingual XML FileType/Multilingual.XML.FileType/Services/DefaultNamespaceHelper.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,25 @@ public DefaultNamespaceHelper(XmlReaderFactory xmlReaderFactory)
1616
_xmlReaderFactory = xmlReaderFactory;
1717
}
1818

19-
public string GetXmlNameSpaceUri(string filePath, Encoding encoding)
19+
public void AddAllNamespacesFromDocument(XmlDocument doc, XmlNamespaceManager nsmgr)
20+
{
21+
var root = doc.DocumentElement;
22+
if (root == null) return;
23+
24+
foreach (XmlAttribute attr in root.Attributes)
25+
{
26+
if (attr.Prefix == "xmlns")
27+
{
28+
nsmgr.AddNamespace(attr.LocalName, attr.Value);
29+
}
30+
else if (attr.Name == "xmlns")
31+
{
32+
nsmgr.AddNamespace(string.Empty, attr.Value); // default namespace
33+
}
34+
}
35+
}
36+
37+
public string GetXmlNameSpaceUri(string filePath, Encoding encoding)
2038
{
2139
string namespaceUri;
2240
using (var fs = new FileStream(filePath, FileMode.Open))

Multilingual XML FileType/Multilingual.XML.FileType/Services/XMLFileSniffer.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Linq;
33
using System.Text;
44
using System.Xml;
5+
using Multilingual.XML.FileType.Extensions;
56
using Multilingual.XML.FileType.FileType.Settings;
67
using Sdl.Core.Globalization;
78
using Sdl.Core.Settings;
@@ -86,7 +87,9 @@ private bool IsFileSupported(string filePath, string namespaceUri, Encoding enco
8687
document.Load(reader);
8788

8889
var nsmgr = new XmlNamespaceManager(document.NameTable);
89-
if (!string.IsNullOrEmpty(namespaceUri))
90+
document.AddAllNamespaces(nsmgr);
91+
92+
if (!string.IsNullOrEmpty(namespaceUri))
9093
{
9194
var defaultNameSpace = new XmlNameSpace { Name = Constants.DefaultNamespace, Value = namespaceUri };
9295
_defaultNamespaceHelper.AddXmlNameSpacesFromDocument(nsmgr, document, defaultNameSpace);
@@ -107,14 +110,19 @@ private bool IsFileSupported(string filePath, string namespaceUri, Encoding enco
107110
}
108111

109112
var nodes = document.SelectNodes(_languageMappingSettings.LanguageMappingLanguagesXPath, nsmgr);
110-
var node = nodes?.Item(0);
111-
112-
supported = _languageMappingSettings.LanguageMappingLanguages.Select(language =>
113-
node?.SelectSingleNode(language.XPath, nsmgr)).Any(target => target != null);
113+
foreach (XmlNode node in nodes)
114+
{
115+
if (_languageMappingSettings.LanguageMappingLanguages.Select(language =>
116+
node?.SafeSelectSingleNode(language.XPath, nsmgr)).Any(target => target != null) == true)
117+
{
118+
return true;
119+
}
120+
121+
}
114122
}
115123
}
116124

117-
return supported;
125+
return false;
118126
}
119127
}
120128
}

Multilingual XML FileType/Multilingual.XML.FileType/Services/XmlNodeService.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using Multilingual.XML.FileType.Extensions;
2+
using System;
23
using System.Collections.Generic;
34
using System.Text.RegularExpressions;
45
using System.Xml;
@@ -50,12 +51,12 @@ public XmlNode AddXmlNode(XmlNode xmlUnit, string xPath)
5051

5152
var queryNode = GetQueryNode(xmlNodeName, validAttributes);
5253

53-
var existingNode = xmlNode.SelectSingleNode(queryNode, _nsmgr);
54+
var existingNode = xmlNode.SafeSelectSingleNode(queryNode, _nsmgr);
5455
if (existingNode == null && !string.IsNullOrEmpty(normalizedXmlNodeName))
5556
{
5657
xmlNodeName = normalizedXmlNodeName;
5758
queryNode = GetQueryNode(normalizedXmlNodeName, validAttributes);
58-
existingNode = xmlNode.SelectSingleNode(queryNode, _nsmgr);
59+
existingNode = xmlNode.SafeSelectSingleNode(queryNode, _nsmgr);
5960
}
6061
if (existingNode == null)
6162
{

0 commit comments

Comments
 (0)