本文是根据自动扫描生成国际化文件后, 叠加的操作, 传送门:
国际化vue-i18n之i18next-scanner自动化使用教程_阿喵阿旺的博客-CSDN博客_i18next vue
然后现在拿到的需求是需要导出一个excel文件给到产品或专业人士核对翻译是否准确, 最终效果如下:
实现代码
// 安装依赖
npm install json2xls -D
const json2xls = require("json2xls");
const path = require("path");
const fs = require("fs");
const getPathInfo = (p) => path.parse(p);
/**
* @description // 递归读取文件,类似于webpack的require.context()
* @param {String} directory 文件目录
* @param {Boolean} useSubdirectories 是否查询子目录,默认false
* @param {array} extList 查询文件后缀,默认 ['.js']
*
*/
function autoLoadFile(directory, useSubdirectories = false, extList = [".js"]) {
const filesList = [];
// 递归读取文件
function readFileList(directory, useSubdirectories, extList) {
const files = fs.readdirSync(directory);
files.forEach((item) => {
const fullPath = path.join(directory, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory() && useSubdirectories) {
readFileList(path.join(directory, item), useSubdirectories, extList);
} else {
const info = getPathInfo(fullPath);
extList.includes(info.ext) && filesList.push(fullPath);
}
});
}
readFileList(directory, useSubdirectories, extList);
// 生成需要的对象
const res = filesList.map((item) => ({
path: item,
data: require(item),
...getPathInfo(item),
}));
return res;
}
// 自动获取同目录下的json文件夹下的json文件
const fileList = autoLoadFile(path.join(__dirname, "./json"), true, [".json"]);
let data = []; // json2xls需要的数据格式: [{zh: "我是中文", en: "i am chinese"}]
fileList.forEach((_, i) => {
// _.data = {Kxxxx:'语言'}
for (const [key, val] of Object.entries(_.data)) {
if (i === 0) {
// 首次遍历新建对应键名
data.push({ 键名: key, [_.name]: val });
} else {
// 非首次遍历匹配对应键名新增数据
data.forEach((e) => {
if (e["键名"] === key) {
e[_.name] = val;
}
});
}
}
});
// 导出excel文件
fs.writeFileSync(
"国际化.xlsx",
json2xls(data),
"binary"
);
生成命令
// 根目录package.json文件添加命令
"scripts": {
"i18n2excel": "node src/i18n/json2Excel.js"
},
// 执行
npm run i18n2excel
项目根目录就能看到 国际化.xlsx 文件了.