magic-i18n
Version:
magic-i18n 一键式实现项目的国际化 语言包 处理的过程
110 lines (102 loc) • 3.39 kB
JavaScript
require("colors");
const path = require("path");
const fs = require("fs");
const Utils = require("../lib/utils");
const FileProcess = require("./fileProcess");
let [messages, rootPath, i18nPath, i18nFile] = [];
/**
* 读取原有的国际化信息放到messages中
*/
const readMessages = () => {
let i18nFilePath = path.join(i18nPath, i18nFile);
if (fs.existsSync(i18nFilePath)) {
messages = require(i18nFilePath);
} else {
messages = {};
}
};
/**
* 将国际化信息放到国际化资源文件中
*/
const writeMessages = () => {
if (!fs.existsSync(i18nPath)) {
Utils.mkdirs(i18nPath);
}
let i18nFilePath = path.join(i18nPath, i18nFile);
// try {
// 同时对已有的其他国际化文件进行更新
// fs.readdirSync(i18nPath).forEach(file => {
// file = path.join(i18nPath, file);
// if (file !== i18nFilePath) {
// let oldMessages = require(file);
// fs.writeFileSync(file, `module.exports = ${JSON.stringify(Object.assign({}, messages, oldMessages), null, '\t')};`, 'utf8');
// }
// });
// } catch (e) {
// }
fs.writeFileSync(
i18nFilePath,
`module.exports = ${JSON.stringify(messages, null, "\t")};`,
"utf8"
);
};
const generateVueFile = (file) => {
let processFile = path.relative(process.cwd(), file);
console.log(`➤ ${processFile.yellow}`.blue);
let content = fs.readFileSync(file, "utf8");
let result = content;
// // 获取模板部分
let [, templateContent = ""] =
content.match(/<template[^>]*>([\s\S]*)<\/template>/im) || [];
templateContent = FileProcess.generateTemplate(messages, templateContent);
result = result.replace(
/<template[^>]*>([\s\S]*)<\/template>/gim,
(_, preTag, content, $3, afterTag) => {
return `${preTag}${templateContent}${afterTag}`;
}
);
// console.log("执行结果", templateContent);
//获取script部分
let [, scriptContent = ""] =
content.match(/<script[^>]*>([\s\S]*)<\/script>/im) || [];
scriptContent = FileProcess.generateScript(messages, scriptContent);
result = result.replace(
/<script[^>]*>([\s\S]*)<\/script>/gim,
(_, preTag, content, $3, afterTag) => {
return `${preTag}${scriptContent}${afterTag}`;
}
);
// console.log('执行结果',result)
// fs.writeFileSync(file, result, 'utf-8');
console.log(`✔ ${processFile.yellow}`.green);
};
const generateJsFile = (file) => {
let processFile = path.relative(process.cwd(), file);
// if(processFile !== 'src/modules/DataModel/services/model.js'){
// return false;
// }
console.log(`➤ ${processFile.yellow}`.blue);
let content = fs.readFileSync(file, "utf8");
let result = content;
result = FileProcess.generateScript(messages, content);
// fs.writeFileSync(file, result, 'utf-8');
console.log(`✔ ${processFile.yellow}`.green);
};
module.exports = function (src, { filepath, filename }) {
rootPath = path.join(process.cwd(), src);
i18nFile = `${filename}.js`;
i18nPath = path.join(process.cwd(), filepath);
readMessages();
Utils.getAllFiles(rootPath).forEach((file) => {
if (file.indexOf(i18nPath) < 0) {
path.extname(file) === ".vue"
? generateVueFile(file)
: generateJsFile(file);
}
});
writeMessages();
console.log(
"✔ 中文资源文件文件都已生成完毕".green,
path.join(i18nPath, i18nFile).blue
);
};