@corellia/ngx-translation-io
Version:
Add this package to localize your Angular application.<br />
284 lines • 14 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.merge = exports.pull = void 0;
const xmldom_1 = __importDefault(require("@xmldom/xmldom"));
const fs_1 = __importDefault(require("fs"));
const minimist_1 = __importDefault(require("minimist"));
const init_request_1 = require("./types/init/init.request");
const sync_request_1 = require("./types/sync/sync.request");
const utils_1 = require("./utils");
const domParser = new xmldom_1.default.DOMParser();
const xmlSerializer = new xmldom_1.default.XMLSerializer();
// Get CLI arguments
const argv = (0, minimist_1.default)(process.argv.slice(2));
const options = JSON.parse(fs_1.default.readFileSync(argv['options'], 'utf8'));
// Set arguments
// Type of extract
const i18nKey = options.i18n_key.trim();
// Source arg.
const sourceLanguage = options.source_language.language.trim();
const sourceFile = options.source_language.file.trim();
// Targets arg.
const targetLanguages = [];
const targetFiles = [];
for (let i = 0; i < options.target_languages.length; i++) {
targetLanguages.push(options.target_languages[i].language.trim());
targetFiles.push(options.target_languages[i].file.trim());
}
// Api arg.
const apiKey = options.api_key.trim();
// Proxy arg.
let proxyUrl = '';
if (options.proxy) {
proxyUrl = options.proxy.trim();
}
/*********** INIT ***********/
if (argv['init']) {
console.log('Start init');
// Init objects
const initRequest = new init_request_1.InitRequest();
initRequest.source_language = sourceLanguage;
initRequest.target_languages = targetLanguages.slice();
// For each target languages, we do some process
for (let x = 0; x < initRequest.target_languages.length; x++) {
// Get and read file for the current target language
const raw = fs_1.default.readFileSync(targetFiles[x], 'utf8');
const xml = domParser.parseFromString(raw, 'text/xml');
const transUnits = xml.getElementsByTagName('trans-unit');
const segments = [];
for (let t = 0; t < transUnits.length; t++) {
const transUnit = transUnits.item(t);
if (!transUnit) {
continue;
}
const id = transUnit.getAttribute('id');
if (id && (segments.findIndex(x => x.key === id) === -1)) {
const initSegmentRequest = new init_request_1.InitSegmentRequest(id, i18nKey);
initSegmentRequest.addSourceAndTarget(transUnit);
initSegmentRequest.addOptions(transUnit, initSegmentRequest.type);
segments.push(initSegmentRequest);
}
else {
console.error(id ? 'Duplicated ids' + id : 'Id not set');
}
}
initRequest.segments[initRequest.target_languages[x]] = segments.slice();
}
const url = 'https://translation.io/api/v1/segments/init.json?api_key=' + apiKey;
// We post the JSON into translation.io
(0, utils_1.httpCall)('POST', url, initRequest, proxyUrl).then(() => { console.log('Init successful !'); }, err => { console.log('Init error !', err); });
}
/*********** SYNC ***********/
if (argv['sync']) {
pull().then(() => __awaiter(void 0, void 0, void 0, function* () {
console.log('Start sync');
yield (0, utils_1.delay)(3000);
// Init objects
const syncRequest = new sync_request_1.SyncRequest();
if (argv['purge']) {
console.log('! Purge enable');
syncRequest.purge = true;
}
if (argv['readonly']) {
console.log('! Readonly enable');
syncRequest.readonly = true;
}
syncRequest.source_language = sourceLanguage;
syncRequest.target_languages = targetLanguages.slice();
// Get and read file "source" for the sync
const raw = fs_1.default.readFileSync(sourceFile, 'utf8');
const xml = domParser.parseFromString(raw, 'text/xml');
const transUnits = xml.getElementsByTagName('trans-unit');
const segments = [];
for (let t = 0; t < transUnits.length; t++) {
const transUnit = transUnits.item(t);
if (!transUnit) {
continue;
}
const id = transUnit.getAttribute('id');
if (id && (segments.findIndex(x => x.key === id) === -1)) {
const syncSegmentRequest = new sync_request_1.SyncSegmentRequest(id, i18nKey);
syncSegmentRequest.addSource(transUnit);
// We add optionals parameters if we find some
syncSegmentRequest.addOptions(transUnit, syncSegmentRequest.type);
segments.push(syncSegmentRequest);
}
else {
console.error(id ? 'Duplicated ids' : 'Id not set');
}
}
syncRequest.segments = segments.slice();
const url = 'https://translation.io/api/v1/segments/sync.json?api_key=' + apiKey;
// We post the JSON into translation.io
try {
const response = yield (0, utils_1.httpCall)('POST', url, syncRequest, proxyUrl);
console.log('Sync successful !');
merge(response);
}
catch (e) {
console.log('Sync error !', e);
}
}), () => { });
}
/*********** PULL ***********/
function pull() {
var _a, _b;
return __awaiter(this, void 0, void 0, function* () {
console.log('Start pull');
const url = 'https://translation.io/api/v1/source_edits/pull.json?api_key=' + apiKey;
const params = '×tamp=0';
// We post the JSON into translation.io
try {
const response = yield (0, utils_1.httpCall)('GET', url, params, proxyUrl);
if (response.source_edits.length > 0) {
const files = targetFiles.slice();
files.push(sourceFile);
const languages = targetLanguages.slice();
languages.push(sourceLanguage);
// Remove old edits from response
const segments = (0, utils_1.getUniqueSegmentFromPull)(response.source_edits);
// For each languages, we do some process
for (let x = 0; x < languages.length; x++) {
// Get and read file for the current language
const raw = fs_1.default.readFileSync(files[x], 'utf8');
const xml = domParser.parseFromString(raw, 'text/xml');
const transUnits = xml.getElementsByTagName('trans-unit');
for (let t = 0; t < transUnits.length; t++) {
const transUnit = transUnits.item(t);
if (!transUnit) {
continue;
}
const id = transUnit.getAttribute('id');
const source = (_a = transUnit.getElementsByTagName('source')) === null || _a === void 0 ? void 0 : _a.item(0);
const target = (_b = transUnit.getElementsByTagName('target')) === null || _b === void 0 ? void 0 : _b.item(0);
if (id && id.startsWith(i18nKey)) {
const index = segments.findIndex(x => x.key === id);
if (index !== -1) {
if (!source) {
continue;
}
const newNode = domParser.parseFromString('<source>' + segments[index].new_source + '</source>', 'text/xml');
transUnit.removeChild(source);
transUnit.appendChild(newNode);
if (languages[x] === sourceLanguage) {
if (!target) {
continue;
}
const newNode = domParser.parseFromString('<target state="final">' + segments[index].new_source + '</target>', 'text/xml');
transUnit.removeChild(target);
transUnit.appendChild(newNode);
}
}
}
}
const newXml = xmlSerializer.serializeToString(xml);
fs_1.default.writeFile(files[x], newXml, (err) => {
if (err) {
console.error('Write file', err);
}
});
}
}
console.log('Pull successful !');
return Promise.resolve();
}
catch (e) {
console.log('Pull error !', e);
return Promise.reject();
}
});
}
exports.pull = pull;
/*********** MERGE ***********/
function merge(sync) {
console.log('Start merge');
// For each target files, we do some process
for (let x = 0; x < targetFiles.length; x++) {
// Get and read file for the current target language
const raw = fs_1.default.readFileSync(targetFiles[x], 'utf8');
const xml = domParser.parseFromString(raw, 'text/xml');
const transUnits = xml.getElementsByTagName('trans-unit');
const key_segments = sync.segments[targetLanguages[x]].filter(x => !!x.key);
const source_segments = sync.segments[targetLanguages[x]].filter(x => !x.key);
for (let t = 0; t < transUnits.length; t++) {
const transUnit = transUnits.item(t);
if (!transUnit) {
continue;
}
const id = transUnit.getAttribute('id');
const source = transUnit.getElementsByTagName('source').item(0);
const target = transUnit.getElementsByTagName('target').item(0);
if (!source) {
continue;
}
const source_string = (0, utils_1.getXMLElementToString)('source', source);
if (id && id.startsWith(i18nKey)) {
const index = key_segments.findIndex(x => x.key === id);
if (index !== -1) {
if (source_string === key_segments[index].source) {
if (!target) {
continue;
}
if (key_segments[index].target === '') {
const newNode = domParser.parseFromString('<target state="needs-translation">' + '@@@@@' + key_segments[index].source + '@@@@@' + '</target>', 'text/xml');
transUnit.removeChild(target);
transUnit.appendChild(newNode);
}
else {
const newNode = domParser.parseFromString('<target state="final">' + key_segments[index].target + '</target>', 'text/xml');
transUnit.removeChild(target);
transUnit.appendChild(newNode);
}
}
else {
console.error('Source are not equivalent : ' + source_string + ' ||| ' + key_segments[index].source);
}
}
else {
console.error('Id is missing in the xliff file : ' + id);
}
}
else {
// Proccessing and updating the xliff file
for (let i = 0; i < source_segments.length; i++) {
if (source_string === source_segments[i].source) {
if (!target) {
continue;
}
if (source_segments[i].target === '') {
const newNode = domParser.parseFromString('<target state="needs-translation">' + '@@@@@' + source_segments[i].source + '@@@@@' + '</target>', 'text/xml');
transUnit.removeChild(target);
transUnit.appendChild(newNode);
}
else {
const newNode = domParser.parseFromString('<target state="final">' + source_segments[i].target + '</target>', 'text/xml');
transUnit.removeChild(target);
transUnit.appendChild(newNode);
}
}
}
}
}
const newXml = xmlSerializer.serializeToString(xml);
fs_1.default.writeFile(targetFiles[x], newXml, (err) => {
if (err) {
console.log('Write file', err);
}
});
}
console.log('Merge successful !');
}
exports.merge = merge;
//# sourceMappingURL=index.js.map