const path = require('path');
const fs = require('fs');
var iconv = require('iconv-lite');
// node执行路径
const dirPath = process.cwd();
// 判断是文件夹还是文件
const fileRead = filedir => {
return new Promise((resolve, reject) => {
fs.stat(filedir, function(err, stats) {
if (err) {
console.warn('获取文件stats失败');
reject(err);
} else {
//文件
const isFile = stats.isFile();
// 文件夹
const isDir = stats.isDirectory();
if (isFile) {
resolve(true);
}
if (isDir) {
resolve(false);
}
}
});
});
};
// 判断文件后缀
function is_filetype(filename, types) {
types = types.split(',');
var pattern = '.(';
for (var i = 0; i < types.length; i++) {
if (0 != i) {
pattern += '|';
}
pattern += types[i].trim();
}
pattern += ')$';
return new RegExp(pattern, 'i').test(filename);
}
// 入口,content接收路径
const fileTra = content => {
//根据文件路径读取文件,返回文件列表
return new Promise((resolve, reject) => {
fs.readdir(content, async function(err, files) {
if (err) {
console.warn(err);
reject(err);
} else {
//遍历读取到的文件列表
await fs.mkdir(path.join(dirPath), { recursive: true }, async err => {
if (err) throw err;
for (let i = 0; i < files.length; i++) {
//获取当前文件的绝对路径
const filedir = path.join(content, files[i]);
//根据文件路径获取文件信息
const isFile = await fileRead(filedir);
// 如果是文件夹,递归遍历该文件夹下面的文件
if (!isFile) {
const backupPath = filedir.substr(
filedir.indexOf('/指定文件名')
);
await fs.mkdir(
path.join(dirPath, 'backupI8n', backupPath),
{ recursive: true },
async err => {
await fileTra(filedir);
}
);
} else {
// 读取文件
if (is_filetype(files[i], 'vue')) {
const fileContent = fs.readFileSync(filedir);
// console.log('fileContent', files[i]);
await getChineseToArray(fileContent, filedir);
}
}
}
});
resolve(files);
}
});
});
};
async function getChineseToArray(content, filedir) {
let obj = {};
let strHead = '{',
strEnd = '}',
all = [];
all.push(strHead);
let str = iconv.decode(content, 'utf-8');
// 代码按行分割出来
let arr = str.split('\n');
arr.forEach(async function(e, i) {
if (
e.indexOf('//') == -1 &&
e.indexOf('console.log') == -1 &&
e.indexOf('@param') == -1 &&
e.indexOf('@brief') == -1
) {
isChineseInit = true;
var a = e.split('\n');
a.forEach(async function(m) {
if (
m.indexOf('* ') == -1 &&
m.indexOf(' * ') == -1 &&
m.indexOf('/*') == -1 &&
m.indexOf('<!--') == -1
) {
const reg = /t\((.+?)\)/g;
const ttreg = /tt\((.+?)\)/g;
if (m.match(ttreg)) {
var key = 'tt+' + String(m).split("'")[1];
obj[key] = `${String(m).split("'")[1]}\n`;
} else if (m.match(reg)) {
var key = String(m).split("'")[1];
obj[key] = `${String(m).split("'")[1]}\n`;
}
}
});
}
}, this);
const backupPath = filedir.substr(filedir.indexOf('/指定文件名'));
for (let key in obj) {
all.push('"' + key + '"' + ': ' + '"' + key + '"' + ',');
}
all.push(strEnd);
const basePath = path.join(
dirPath,
'backupI8n',
backupPath.replace('vue', 'json')
);
// flag: r只读,w可写,a追加
fs.writeFileSync(basePath, all.join('\n'), { encoding: 'utf8', flag: 'w' });
}
fileTra('/Users/Documents/project/file/filename/src/views'); // 执行入口写路径
在同目录下新建backupI8n文件夹
效果: