Files
omni-tools/scripts/locize-upload.js
Ibrahima G. Coulibaly be53b60bd3 chore: locize upload
2025-07-13 17:17:35 +01:00

214 lines
5.6 KiB
JavaScript

// one-time-upload.js
// Simple script to upload your existing translations to Locize once
const fs = require('fs');
const https = require('https');
// Configuration
const LOCIZE_PROJECT_ID = 'e7156a3e-66fb-4035-a0f0-cebf1c63a3ba';
const LOCIZE_API_KEY = process.env.LOCIZE_API_KEY; // Replace with your actual API key
const LOCIZE_VERSION = 'latest';
// Define your translation files
const translationFiles = [
// English translations
{ lang: 'en', namespace: 'translation', file: '../src/i18n/en.json' },
{
lang: 'en',
namespace: 'list',
file: '../src/pages/tools/list/i18n/en.json'
},
{
lang: 'en',
namespace: 'string',
file: '../src/pages/tools/string/i18n/en.json'
},
{ lang: 'en', namespace: 'csv', file: '../src/pages/tools/csv/i18n/en.json' },
{
lang: 'en',
namespace: 'json',
file: '../src/pages/tools/json/i18n/en.json'
},
{ lang: 'en', namespace: 'pdf', file: '../src/pages/tools/pdf/i18n/en.json' },
{
lang: 'en',
namespace: 'image',
file: '../src/pages/tools/image/i18n/en.json'
},
{
lang: 'en',
namespace: 'audio',
file: '../src/pages/tools/audio/i18n/en.json'
},
{
lang: 'en',
namespace: 'video',
file: '../src/pages/tools/video/i18n/en.json'
},
{
lang: 'en',
namespace: 'number',
file: '../src/pages/tools/number/i18n/en.json'
},
{
lang: 'en',
namespace: 'time',
file: '../src/pages/tools/time/i18n/en.json'
},
{ lang: 'en', namespace: 'xml', file: '../src/pages/tools/xml/i18n/en.json' },
// Hindi translations
{ lang: 'hi', namespace: 'translation', file: '../src/i18n/hi.json' },
{
lang: 'hi',
namespace: 'list',
file: '../src/pages/tools/list/i18n/hi.json'
},
{
lang: 'hi',
namespace: 'string',
file: '../src/pages/tools/string/i18n/hi.json'
},
{ lang: 'hi', namespace: 'csv', file: '../src/pages/tools/csv/i18n/hi.json' },
{
lang: 'hi',
namespace: 'json',
file: '../src/pages/tools/json/i18n/hi.json'
},
{ lang: 'hi', namespace: 'pdf', file: '../src/pages/tools/pdf/i18n/hi.json' },
{
lang: 'hi',
namespace: 'image',
file: '../src/pages/tools/image/i18n/hi.json'
},
{
lang: 'hi',
namespace: 'audio',
file: '../src/pages/tools/audio/i18n/hi.json'
},
{
lang: 'hi',
namespace: 'video',
file: '../src/pages/tools/video/i18n/hi.json'
},
{
lang: 'hi',
namespace: 'number',
file: '../src/pages/tools/number/i18n/hi.json'
},
{
lang: 'hi',
namespace: 'time',
file: '../src/pages/tools/time/i18n/hi.json'
},
{ lang: 'hi', namespace: 'xml', file: '../src/pages/tools/xml/i18n/hi.json' }
];
function flattenJson(obj, prefix = '') {
const flattened = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
const newKey = prefix ? `${prefix}.${key}` : key;
if (
typeof obj[key] === 'object' &&
obj[key] !== null &&
!Array.isArray(obj[key])
) {
// Recursively flatten nested objects
Object.assign(flattened, flattenJson(obj[key], newKey));
} else {
// It's a primitive value or array
flattened[newKey] = obj[key];
}
}
}
return flattened;
}
function uploadToLocize(lang, namespace, data) {
return new Promise((resolve, reject) => {
// Flatten the JSON structure for Locize API
const flattenedData = flattenJson(data);
const postData = JSON.stringify(flattenedData);
const options = {
hostname: 'api.locize.app',
port: 443,
path: `/update/${LOCIZE_PROJECT_ID}/${LOCIZE_VERSION}/${lang}/${namespace}`,
method: 'POST',
headers: {
Authorization: `Bearer ${LOCIZE_API_KEY}`,
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(postData)
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => (data += chunk));
res.on('end', () => {
if (res.statusCode === 200) {
resolve(JSON.parse(data));
} else {
reject(new Error(`HTTP ${res.statusCode}: ${data}`));
}
});
});
req.on('error', reject);
req.write(postData);
req.end();
});
}
async function main() {
console.log('Starting one-time upload to Locize...\n');
let successCount = 0;
let errorCount = 0;
for (const { lang, namespace, file } of translationFiles) {
try {
// Check if file exists
if (!fs.existsSync(file)) {
console.log(`⚠️ File not found: ${file}`);
continue;
}
// Read translation file
const translations = JSON.parse(fs.readFileSync(file, 'utf8'));
const flattenedTranslations = flattenJson(translations);
const keyCount = Object.keys(flattenedTranslations).length;
if (keyCount === 0) {
console.log(`⚠️ Empty file: ${lang}/${namespace}`);
continue;
}
// Upload to Locize
await uploadToLocize(lang, namespace, translations);
console.log(`${lang}/${namespace} - ${keyCount} keys uploaded`);
successCount++;
} catch (error) {
console.error(`${lang}/${namespace} - Error: ${error.message}`);
errorCount++;
}
}
console.log('\n=== Upload Summary ===');
console.log(`✅ Successful uploads: ${successCount}`);
console.log(`❌ Failed uploads: ${errorCount}`);
console.log(`📊 Total files processed: ${successCount + errorCount}`);
if (errorCount === 0) {
console.log('\n🎉 All translations uploaded successfully!');
console.log('You can now view them in your Locize dashboard.');
}
}
// Run the upload
main().catch(console.error);