arb-convert
Version:
Convert Application Resource Bundle (ARB) translation files to other translation formats and back
147 lines (146 loc) • 6.1 kB
JavaScript
;
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;