VScode插件——多语言处理

185 阅读1分钟

每当碰到一个新需求,多语言文件新增就看得脑瓜子晕乎乎的,三个文件切来切去,后面用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,
};

插件演示

  1. 搜索插件tech-lang-excel-json
  2. 重启编辑器
  3. Ctrl + A 选择需转换的文件
  4. Ctrl + Shift + P 选择 excel Trans to Object 命令即可

测试数据链接语言包-mianland-address

参考文档