71 lines
1.7 KiB
JavaScript
Executable File
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); |