soundbirder/utils/extract-i18n.js

71 lines
1.7 KiB
JavaScript
Executable File

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const messagePattern = /\_\_\('([^']+)'\)/g;
function getSourceFiles(dirs) {
let sourceFiles = [];
for (let dir of dirs) {
let files = fs.readdirSync(dir);
let sourceFilesDir = files.filter(file => file.endsWith('.pug') || file.endsWith('.js'));
sourceFilesDir = sourceFilesDir.map(file => path.join(dir, file));
sourceFiles = [...sourceFiles, ...sourceFilesDir];
}
return sourceFiles;
}
function extractAllMessages(files) {
let allMessages = [];
files.forEach(file => {
const content = fs.readFileSync(file, 'utf8');
messages = extractMessages(content);
allMessages = allMessages.concat(messages);
});
return allMessages;
}
function extractMessages(content) {
let messages = [];
let match;
while (match = messagePattern.exec(content)) {
messages.push(match[1]);
}
return messages;
}
function dumps(dir, locales, messages) {
const uniqueMessages = [...new Set(messages)];
locales.forEach(lang => {
const file = path.join(dir, 'locales', lang + '.json');
let content = JSON.parse(fs.readFileSync(file, 'utf8'));
uniqueMessages.forEach(message => {
if (!content[message]) {
content[message] = `__${message}`;
}
});
fs.writeFileSync(file, JSON.stringify(content, null, 2));
});
}
const extractor = {
run(dirs) {
const files = getSourceFiles(dirs);
const messages = extractAllMessages(files);
return messages;
},
dumps
};
const [,, ...args] = process.argv
const DIRS = ["controllers", "views", "views/auth"];
const LOCALES = args.slice(args.length) || ['en'];
const keys = extractor.run(DIRS);
extractor.dumps('.', LOCALES, keys);