功能:将分布在各個子產品下的翻譯檔案,合并生成一個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();
});
};