每当碰到一个新需求,多语言文件新增就看得脑瓜子晕乎乎的,三个文件切来切去,后面用Excel转Json,但是多语言的key从en转换还是得先做一层正则替换,碰到换行还会json错乱对不上号,有时候Key太长还得全部截断一次,换完之后还得从json格式转为对象格式,手动copy之后还得正则处理一波,全是重复劳动力,所以针对自己项目开发,整一个内部vscode插件,来解放双手。具体教程网上很多不再赘述
我的代码
可以根据以下代码自定义自己项目组的的专属插件
//tech-lang-excel-json
const vscode = require("vscode");
/**
* @param {vscode.ExtensionContext} context
*/
function activate(context) {
console.log(
'Congratulations, your extension "tech-lang-excel-json" is now active!'
);
const disposable = vscode.commands.registerCommand(
"tech-lang-excel-json.excelTransObj",
function () {
const editor = vscode.window.activeTextEditor;
if (editor) {
const document = editor.document;
const selection = editor.selection;
const orignData = document.getText(selection);
// 给定的文本内容(使用制表符 \t 分隔)
const headers = `tc sc en name`;
// 将文本内容按行分割
// 将每行数据按制表符分割成数组
let word = orignData.replace(/"([^"]*)"/g, (match, p1) => {
return `${p1.trim().replace(/"/g, "").replace(/(\n)+/g, "❄")}`;
});
// // 将文本内容按行分割
const rows = (headers + "\n" + word).split("\n");
// 将每行数据按制表符分割成数组
let sheetOriginData = rows.map((row) =>
row.split("\t").map((item) => item.replace(/\r/g, ""))
);
let sheetData = [];
sheetOriginData.forEach((item) => {
if (!item[0].includes("❄")) {
sheetData.push(item);
return;
}
const list = item.reduce((pre, cur, langIndex) => {
const col = cur.split("❄");
col.forEach((item, index) => {
pre[index] = pre[index] ? pre[index] : [];
pre[index][langIndex] = item;
});
return pre;
}, []);
sheetData = sheetData.concat(list);
});
const jsonData = [];
// 获取标题行
// 遍历数据行,根据 en 列生成 name 列
for (let i = 1; i < sheetData.length; i++) {
const enValue = sheetData[i][2]; // en 列的值
let str = enValue.replace(/[^a-zA-Z]/g, "");
let nameValue = str;
if (str.length > 20) {
nameValue = str.slice(0, 10) + str.slice(-10);
}
sheetData[i][2] = enValue.replace(/[\r]/g, "");
sheetData[i].push(nameValue); // 将生成的 name 值添加到当前行
const item = sheetData[i].reduce((pre, cur, index) => {
return { ...pre, [`${sheetData[0][index]}`]: cur };
}, {});
jsonData.push({
...item,
});
}
const outputData = sheetData[0]
.slice(0, 3)
.reduce((pre, cur, nameIndex) => {
const item = sheetData.reduce((pre, cur, index) => {
if (!index || !sheetData[index][3]) {
return pre;
}
return {
...pre,
[`${sheetData[index][3]}`]: `${sheetData[index][nameIndex]}`,
};
}, {});
return { ...pre, [`${cur}Obj`]: { ...item } };
}, {});
const jsonString = "const a = " + JSON.stringify(outputData, null, 2);
editor.edit((editBuilder) => {
editBuilder.replace(selection, jsonString);
});
}
}
);
context.subscriptions.push(disposable);
}
function deactivate() {}
module.exports = {
activate,
deactivate,
};
插件演示
- 搜索插件tech-lang-excel-json
- 重启编辑器
Ctrl + A选择需转换的文件Ctrl + Shift + P选择 excel Trans to Object 命令即可
测试数据链接语言包-mianland-address