UNPKG

arb-convert

Version:

Convert Application Resource Bundle (ARB) translation files to other translation formats and back

149 lines (148 loc) 5.92 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = exports.convert = void 0; var xml_js_1 = require("xml-js"); var escapeValue_1 = __importDefault(require("../util/escapeValue")); var makeElement_1 = __importDefault(require("../util/makeElement")); var makeText_1 = __importDefault(require("../util/makeText")); var xmlQuery_1 = __importDefault(require("../util/xmlQuery")); function convert(_a) { var source = _a.source, target = _a.target, original = _a.original, sourceLanguage = _a.sourceLanguage, targetLanguage = _a.targetLanguage; var sourceJs = JSON.parse(source); var targetJs = target ? JSON.parse(target) : null; var units = Object.keys(sourceJs) .filter(function (key) { return key[0] !== '@'; }) .map(function (key) { var sourceString = sourceJs[key]; var targetString = targetJs && targetJs[key]; var _a = sourceJs["@" + key], description = _a.description, placeholders = _a.placeholders; var notesChildren = []; var segmentChildren = [ makeElement_1.default('source', {}, [makeText_1.default(sourceString)]), ]; if (targetString) { segmentChildren.push(makeElement_1.default('target', {}, [makeText_1.default(targetString)])); } if (description) { notesChildren.push(makeElement_1.default('note', { category: 'description', }, [makeText_1.default(description)])); } if (Object.keys(placeholders).length > 0) { Object.keys(placeholders).forEach(function (paramName) { Object.keys(placeholders[paramName]).forEach(function (property) { notesChildren.push(makeElement_1.default('note', { category: 'placeholder', }, [ makeText_1.default("{" + paramName + "} " + property + ": " + placeholders[paramName][property]), ])); }); }); } var unitChildren = [ makeElement_1.default('segment', {}, segmentChildren), ]; if (notesChildren.length > 0) { unitChildren.unshift(makeElement_1.default('notes', {}, notesChildren)); } return makeElement_1.default('unit', { id: escapeValue_1.default(key) }, unitChildren); }); var root = makeElement_1.default('xliff', { 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation': 'urn:oasis:names:tc:xliff:document:2.0 http://docs.oasis-open.org/xliff/xliff-core/v2.1/cos02/schemas/xliff_core_2.0.xsd', xmlns: 'urn:oasis:names:tc:xliff:document:2.0', version: '2.0', srcLang: sourceLanguage, trgLang: targetLanguage, }, [ makeElement_1.default('file', { id: 'arb', original: original, 'xml:space': 'preserve', }, units), ]); var content = xml_js_1.js2xml({ elements: [root], }, { spaces: ' ', }); return { content: content }; } exports.convert = convert; function parse(_a) { var content = _a.content; var srcArb = {}; var trgArb = {}; var xmlJsNode = xml_js_1.xml2js(content); var parsedXml = xmlQuery_1.default(xmlJsNode); var xliff = parsedXml.query('xliff'); var sourceLanguage = String(xliff.attributes.srcLang || ''); var targetLanguage = String(xliff.attributes.trgLang || ''); var file = xliff.query('file'); var original = String(file.attributes.original || ''); srcArb['@@locale'] = sourceLanguage.replace('-', '_'); srcArb['@@last_modified'] = new Date(Date.now()).toISOString(); if (targetLanguage) { trgArb['@@locale'] = targetLanguage.replace('-', '_'); trgArb['@@last_modified'] = new Date(Date.now()).toISOString(); } file .queryAll('unit') .forEach(function (unit) { var sourceText = unit .queryAll('segment') .query('source') .innerText(); var targetText = unit .queryAll('segment') .query('target') .innerText(); var description = unit .query('notes') .query(function (el) { return el.name === 'note' && el.attributes != null && el.attributes.category === 'description'; }) .innerText(); var placeholders = {}; unit .query('notes') .queryAll(function (el) { return el.name === 'note' && el.attributes != null && el.attributes.category === 'placeholder'; }) .forEach(function (el) { var _a; var match = el.innerText().match(/^\{([\w-]+)\} (.*): (.*)$/); if (match) { var key = match[1], type = match[2], value = match[3]; placeholders[key] = (_a = {}, _a[type] = value, _a); } }); srcArb[unit.attributes.id] = sourceText; srcArb["@" + unit.attributes.id] = { description: description, type: 'text', placeholders: placeholders, }; trgArb[unit.attributes.id] = targetText; trgArb["@" + unit.attributes.id] = { description: description, type: 'text', placeholders: placeholders, }; }); var source = JSON.stringify(srcArb, null, 2); var target = targetLanguage ? JSON.stringify(trgArb, null, 2) : ''; return { source: source, target: target, original: original, sourceLanguage: sourceLanguage, targetLanguage: targetLanguage, }; } exports.parse = parse;