天天看點

國際化node工具

功能:将分布在各個子產品下的翻譯檔案,合并生成一個json檔案
// apodidae/src/utils/CreateJson.js
/**
 * 說明:
 * 1. 使用這個指令需要将所有需要國際化的文案寫在對應目錄下的messages檔案或者utils下的公共messages中;
 * 2. 請勿直接操作 例如 zh.json 檔案, 因為使用指令時是全量覆寫。會導緻丢失;
 */

const fs = require('fs');
const path = require('path');
const glob = require('glob');

const args = process.argv.slice(2);

const targetDir = 'src/translations';
const fileName = args[0] || 'zhByToolCreate.json';
// const isReplace = args[1] || false;
const JsonRes = {};

function writeCallBack() {
  fs.writeFile(path.join(process.cwd(), targetDir, `${fileName}.json`), JSON.stringify(JsonRes, null, '\t'), (err) => {
    if (err) throw err;
    console.log(` success  ${targetDir}/${fileName}.json   已生成, 請在對應目錄下檢視`);
  });
}

// create all messages
glob(`${process.cwd()}/**/*{m,M}essages.{tsx,js,jsx,ts}`, { ignore: `${process.cwd()}/node_modules/*/**` }, (err, files) => {
  // console.log(files, files.length);
  files.forEach((fileDir) => {
    const res = fs.readFileSync(fileDir, { encoding: 'UTF-8' });
    const isReplace = true;
    // const keys = res.match(/(?<=id: ').*?(?=',)/g);
    // const containers = `${process.cwd()}/src/containers/`;
    let NameSpace = '';
    // if (isReplace && fileDir.includes(containers)) {
    //   NameSpace = fileDir.match(/(?<=containers\/).*?(?=\/messages)/g);
    // }

    if (isReplace) {
      NameSpace = fileDir.match(/(?<=containers\/).*?(?=\/messages)/g);
    }
    let keys = res.match(/(?<=id: ').*?(?=',)|(?<=id: `).*?(?=`,)/g);
    if (!keys || keys.length <= 0) {
      console.log(fileDir, '沒有查找到Keys');
      return;
    }
    if (isReplace && NameSpace) {
      // console.log(keys, 'keys');
      keys = keys.map((key) => {
        return key.replace(/\${NAMESPACE}/, NameSpace);
      });
      // console.log(keys, 'keys');
    }


    const texts = res.match(/(?<=defaultMessage: ').*?(?=')/g) || [];
    // console.log(keys, texts);
    if (texts.length === 0) {
      // eslint-disable-next-line no-console
      console.log(fileDir, '沒有查找到texts');
    }
    keys.forEach((key, index) => {
      JsonRes[key] = texts[index];
    });
  });
  // writeCallBack();
  handleMenuFile();
});
const handleMenuFile = () => {
  // 特殊處理  main.menu.tsx 檔案
  glob(`${process.cwd()}/config/menu.conf.tsx`, { ignore: `${process.cwd()}/node_modules/*/**` }, (err, files) => {
    files.forEach((fileDir) => {
      const res = fs.readFileSync(fileDir, { encoding: 'UTF-8' });
      const keys = res.match(/(?<=id: ').*?(?=',)|(?<=id: `).*?(?=`,)/g);
      if (!keys || keys.length <= 0) {
        console.log(fileDir, '沒有查找到Keys', res);
        return;
      }
      const texts = res.match(/(?<=defaultMessage: ').*?(?=')/g) || [];
      // console.log(keys, texts);
      if (texts.length === 0) {
        console.log(fileDir, '沒有查找到texts');
      }
      keys.forEach((key, index) => {
        JsonRes[key] = texts[index];
      });
    });
    writeCallBack();
  });
};

           

繼續閱讀