UNPKG

arb-convert

Version:

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

147 lines (146 loc) 6.1 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 transUnits = 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 children = [ makeElement_1.default('source', {}, [makeText_1.default(sourceString)]), ]; if (targetString) { children.push(makeElement_1.default('target', {}, [makeText_1.default(targetString)])); } if (description) { children.push(makeElement_1.default('note', { from: 'developer' }, [makeText_1.default(description)])); } if (Object.keys(placeholders).length > 0) { var contextGroupChildren_1 = []; Object.keys(placeholders).forEach(function (paramName) { Object.keys(placeholders[paramName]).forEach(function (property) { contextGroupChildren_1.push(makeElement_1.default('context', { 'context-type': 'paramnotes', }, [ makeText_1.default("{" + paramName + "} " + property + ": " + placeholders[paramName][property]), ])); }); }); children.push(makeElement_1.default('context-group', { purpose: 'informational', }, contextGroupChildren_1)); } return makeElement_1.default('trans-unit', { id: escapeValue_1.default(key) }, children); }); var root = makeElement_1.default('xliff', { 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation': 'urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd', xmlns: 'urn:oasis:names:tc:xliff:document:1.2', version: '1.2', }, [ makeElement_1.default('file', { original: original, datatype: 'plaintext', 'xml:space': 'preserve', 'source-language': sourceLanguage, 'target-language': targetLanguage, date: new Date(Date.now()).toISOString(), }, [ makeElement_1.default('body', {}, transUnits), ]), ]); 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 file = xliff.query('file'); var original = String(file.attributes.original || ''); var sourceLanguage = String(file.attributes['source-language'] || ''); var targetLanguage = String(file.attributes['target-language'] || ''); 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 .query('body') .queryAll('trans-unit') .forEach(function (transUnit) { var sourceText = transUnit .query('source') .innerText(); var targetText = transUnit .query('target') .innerText(); var description = transUnit .query(function (el) { return el.name === 'note' && el.attributes != null && el.attributes.from === 'developer'; }) .innerText(); var placeholders = {}; transUnit .queryAll(function (el) { return el.name === 'context-group' && el.attributes != null && el.attributes.purpose === 'informational'; }) .queryAll(function (el) { return el.name === 'context' && el.attributes != null && el.attributes['context-type'] === 'paramnotes'; }) .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[transUnit.attributes.id] = sourceText; srcArb["@" + transUnit.attributes.id] = { description: description, type: 'text', placeholders: placeholders, }; trgArb[transUnit.attributes.id] = targetText; trgArb["@" + transUnit.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;