red-ui/tools/auto-i18n/i18n-cleanup.ts
Timo Bejan 9226df2760 csp
2021-11-10 14:13:09 +02:00

107 lines
3.3 KiB
TypeScript

import * as fs from 'fs';
import axios from 'axios';
import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
function flatten(data: any) {
const result: any = {};
function recurse(cur: any, prop: any) {
if (Object(cur) !== cur) {
result[prop] = cur;
} else if (Array.isArray(cur)) {
let l = 0;
for (let i = 0, l = cur.length; i < l; i++) recurse(cur[i], prop + '[' + i + ']');
if (l === 0) result[prop] = [];
} else {
let isEmpty = true;
for (const p in cur) {
isEmpty = false;
recurse(cur[p], prop ? prop + '.' + p : p);
}
if (isEmpty && prop) result[prop] = {};
}
}
recurse(data, '');
return result;
}
function unflatten(data: any) {
if (Object(data) !== data || Array.isArray(data)) return data;
const regex = /\.?([^.\[\]]+)|\[(\d+)\]/g,
resultholder: any = {};
for (const p in data) {
let cur: any = resultholder,
prop = '',
m: any;
while ((m = regex.exec(p))) {
cur = cur[prop] || (cur[prop] = m[2] ? [] : {});
prop = m[2] || m[1];
}
cur[prop] = data[p];
}
return resultholder[''] || resultholder;
}
async function execute() {
// const flatGerman = JSON.parse(fs.readFileSync('de-flat.json', 'utf-8'));
const german = JSON.parse(fs.readFileSync('./../../apps/red-ui/src/assets/i18n/de.json', 'utf-8'));
const flatGerman = flatten(german);
const english = JSON.parse(fs.readFileSync('./../../apps/red-ui/src/assets/i18n/en.json', 'utf-8'));
const flatEnglish = flatten(english);
const apiKey = 'AIzaSyBiqNTundSKFjAJnSb4wSVLDU6w0Kv651M';
const tmfc = new TranslateMessageFormatCompiler();
for (const key of Object.keys(flatEnglish)) {
if (!flatGerman[key]) {
const value = flatEnglish[key];
const apiUrl = `https://www.googleapis.com/language/translate/v2?key=${apiKey}&q=${value}&source=en&target=de`;
const response = await axios.get(apiUrl);
let translated = flatEnglish[key];
try {
translated = response.data.data.translations[0].translatedText;
} catch (e) {}
console.log('missing: ' + key + ' -> ' + flatEnglish[key] + ' -> ' + translated);
flatGerman[key] = translated;
}
}
for (let key of Object.keys(flatGerman)) {
if (!flatEnglish[key]) {
delete flatGerman[key];
}
}
for (let key of Object.keys(flatGerman)) {
try {
const result = tmfc.compile(flatGerman[key], 'de');
//console.log(result);
} catch (e) {
console.error('ERROR AT: ', flatGerman[key]);
}
}
for (let key of Object.keys(flatEnglish)) {
try {
const result = tmfc.compile(flatEnglish[key], 'de');
console.log(result);
} catch (e) {
console.error('ERROR AT: ', flatEnglish[key]);
}
}
const mergedGerman = { ...flatEnglish, ...flatGerman };
const finalGerman = unflatten(mergedGerman);
fs.writeFileSync('./../../apps/red-ui/src/assets/i18n/de.json', JSON.stringify(finalGerman));
}
execute().then();