Are there any existing helpers that aid with serialization/deserialization of translation jobs?
I'm not stuck on this, but I was wondering whether there are any existing helpers that can make my current IJobSerializer implementation cleaner. Below is the code I'm currently using.
public class StrakerSerializer : IJobSerializer<XmlDocument> {
public string Name => "Straker Serializer";
public string Format => "xml";
private ILogger _logger;
public StrakerSerializer(ILogger logger) {
_logger = logger;
}
public TranslationAttempt<TranslationJob> Deserialize(XmlDocument source, TranslationJob job, bool valuesInSource, bool matchLanguages) {
var entries = new Dictionary<string, string>();
foreach (XmlElement node in source.SelectNodes("data")) {
entries.Add(node.GetAttribute("name"), node.SelectSingleNode("value").InnerXml);
}
foreach (var node in job.Nodes) {
node.Status = NodeStatus.Reviewing;
foreach (var group in node.Groups) {
foreach (var property in group.Properties) {
var key = property.NodeKey.ToString();
if (entries.ContainsKey(key)) {
property.Target.Value = entries[key];
}
}
}
}
return TranslationAttempt<TranslationJob>.Succeed(job);
}
public TranslationAttempt<XmlDocument> Serialize(TranslationJob job, string sourceLang, string targetLang, bool splitHtml) {
var doc = new XmlDocument();
var xmlDeclaration = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(xmlDeclaration);
var root = doc.CreateElement("root");
doc.AppendChild(root);
try {
foreach (var node in job.Nodes) {
foreach (var group in node.Groups) {
foreach (var property in group.Properties) {
var item = doc.CreateElement("data");
if (!string.IsNullOrEmpty(property.Source.Value)) {
item.SetAttribute("name", property.NodeKey.ToString());
item.InnerXml = "<value>" + property.Source.Value + "</value>";
root.AppendChild(item);
}
if (property.Source.InnerValues.Count > 0) {
foreach (var pair in property.Source.InnerValues) {
GetValue(pair.Value, doc, root);
}
}
}
}
}
return TranslationAttempt<XmlDocument>.Succeed(doc);
}
catch (Exception e) {
return TranslationAttempt<XmlDocument>.Fail($"Failed to serialize job {job.Id} for straker.", e);
}
}
private void GetValue(TranslationValue value, XmlDocument doc, XmlElement root) {
if (!string.IsNullOrEmpty(value.Value)) {
var item = doc.CreateElement("data");
item.SetAttribute("name", value.DisplayName.ToString());
item.InnerXml = "<value>" + value.Value + "</value>";
root.AppendChild(item);
}
if (value.InnerValues.Count > 0) {
foreach (var pair in value.InnerValues) {
GetValue(pair.Value, doc, root);
}
}
}
}
It's still a work in progress, as I'm pretty sure this doesn't ensure unique names when serialized (see structure I'm converting to here). I may just end up using the Xliff Serializer and chop up what it returns to get what I need, but I wanted to check whether there is a cleaner way to handle this.
Also, where is deserialization supposed to be triggered?
We don't have any specific helpers for just XML, there are things to serialise in and out of XLIFF formats.
And they look similar to what you have (with a bit of XLIFF library stuff thrown in).
The tricky bit is the recursion as each value can have child values, so you need to make sure you do that both in and out (looks like you have missed this at the Deserialize end?) and when setting the low-level target value, you should also set the Translated boolean value to True as this is used in the checks (as noted in another response).
Yeah I hadn't updated up the deserialize method yet to match the recursion in the serialization, as I didn't have the logic that triggers deserialization wired up yesterday. I was able to get this working today.
Are there any existing helpers that aid with serialization/deserialization of translation jobs?
I'm not stuck on this, but I was wondering whether there are any existing helpers that can make my current IJobSerializer implementation cleaner. Below is the code I'm currently using.
It's still a work in progress, as I'm pretty sure this doesn't ensure unique names when serialized (see structure I'm converting to here). I may just end up using the Xliff Serializer and chop up what it returns to get what I need, but I wanted to check whether there is a cleaner way to handle this.
Also, where is deserialization supposed to be triggered?
Hi
We don't have any specific helpers for just XML, there are things to serialise in and out of XLIFF formats.
And they look similar to what you have (with a bit of XLIFF library stuff thrown in).
The tricky bit is the recursion as each value can have child values, so you need to make sure you do that both in and out (looks like you have missed this at the Deserialize end?) and when setting the low-level target value, you should also set the Translated boolean value to True as this is used in the checks (as noted in another response).
Yeah I hadn't updated up the deserialize method yet to match the recursion in the serialization, as I didn't have the logic that triggers deserialization wired up yesterday. I was able to get this working today.
is working on a reply...