/* * Updates XML presets files using translations from Transifex */ const fs = require('fs'); const xml2js = require('xml2js'); const Hash = require("object-hash"); const PRESETS_DIR = "./public/presets"; const LOCALES_DIR = "./src/config/locales/presets"; const XML_RGX = /^[A-Za-z0-9_\-]+\.xml$/; const JSON_RGX = /^[A-Za-z0-9_\-]+\.json$/; // Load in-memory all translation files let locales = {}; fs.readdirSync(LOCALES_DIR).forEach((file) => { if(JSON_RGX.test(file) && file !== "en.json") { try { const localeJson = JSON.parse(fs.readFileSync(LOCALES_DIR+"/"+file, 'utf8')); locales = Object.assign(locales, localeJson); } catch(e) { throw new Error("Can't parse translation file: "+file+" ("+e.message+")"); } } }); // Function for adding translation to given object const addTranslation = entry => { Object.entries(entry).forEach(e => { const [ k, v ] = e; if(k === "$") { Object.entries(v).forEach(ve => { const [ vk, vv ] = ve; if([ "text", "name", "display_values", "display_value"].includes(vk)) { const strhash = Hash(vv); Object.keys(locales).forEach(l => { if(locales[l][strhash] && locales[l][strhash] !== vv) { v[l+"."+vk] = locales[l][strhash]; } }); } }); } else { addTranslation(v); } }); return entry; }; // Read all presets files, add translations, and rewrite them fs.readdirSync(PRESETS_DIR).forEach((file) => { if(XML_RGX.test(file)) { try { const xml = fs.readFileSync(PRESETS_DIR+"/"+file, 'utf8'); // Parse XML content xml2js.parseString(xml, (err, result) => { if (err) { throw new Error("Parse error", e.message); } else { // Append translations to JS object result = addTranslation(result); // Rewrite XML file const newXml = (new xml2js.Builder({ renderOpts: { pretty: true, indent: '\t' } })).buildObject(result); fs.writeFile(PRESETS_DIR+"/"+file, newXml, function(err) { if(err) { throw new Error(err); } else { console.log("[INFO] Preset file "+file+" updated"); } }); } }); } catch(e) { throw new Error("Can't update preset: "+file+" ("+e.message+")"); } } else { console.log("[INFO] Ignored file "+file); } });