UNPKG

magic-i18n

Version:

magic-i18n 一键式实现项目的国际化 语言包 处理的过程

125 lines (117 loc) 4.77 kB
require('colors'); const path = require('path'); const fs = require('fs'); const ora = require('ora'); const { config_file } = require('./const'); const Utils = require('../lib/utils'); const FileProcess = require('./fileProcess'); let messages = {}; let rootPath = null const generateVueFile = (file) => { let content = fs.readFileSync(file, 'utf8'); // // 获取模板部分 let [, templateContent = ''] = content.match(/<template[^>]*>((.|\n)*)<\/template>/im) || []; FileProcess.generateTemplate(messages, templateContent); //获取script部分 let [, scriptContent = ''] = content.match(/<script[^>]*>((.|\n)*)<\/script>/im) || []; FileProcess.generateScript(messages, scriptContent); }; const generateJsFile = (file) => { let content = fs.readFileSync(file, 'utf8'); FileProcess.generateScript(messages, content); }; module.exports = async function (src) { const spinner = ora("➤ 开始清理语言包,请稍后......".blue); spinner.start(); let processFile = '' let chData = {} //中文数据 let enData = {} //译文数据(英文)和 map文件 let delKey = {} // 要删除的key // 检测有无初始化配置文件 if (fs.existsSync(config_file)) { processFile = path.join(process.cwd(), config_file); config = require(processFile); } else { spinner.fail(`${config_file}文件不存在,请先初始化项目`.red); return; } // 读取中文文件 if (fs.existsSync(config.dir + config.file)) { processFile = path.join(process.cwd(), config.dir + config.file); chData = require(processFile) } else { spinner.fail(`中文语言包不存在,${config.dir+config.file}\n`.red); return; } let langList = [] // 已有的语言列表 如 ['en'] try { // 获取所有的需要导入的语言 fs.readdirSync(config.dir).forEach(file => { // en.js.map转化 const lang = file.split('.')[0] if (file.indexOf('js.map') !== -1) { langList.push(lang) } }); } catch (e) {} // ----- 重新抓取中文,得到在使用得语言包 messages ----- rootPath = path.join(process.cwd(), src); Utils.getAllFiles(rootPath).forEach(file => { if (file.indexOf(config.dir) < 0) { path.extname(file) === '.vue' ? generateVueFile(file) : generateJsFile(file); } }); // ----- 重新抓取中文,得到在使用得语言包 messages ----- // 处理中文,获取被删除的key值 Object.keys(chData).forEach(key=>{ if(!messages.hasOwnProperty(key)){ const value = chData[key]; const md5 = Utils.Md5_16(value); if(md5 === key){ delKey[key] = value; // 删除已无用的中文 delete chData[key] } } }) rootPath = path.join(process.cwd(), config.dir + config.file); fs.writeFileSync(rootPath, `module.exports = ${JSON.stringify(chData, null, '\t')};`, 'utf8'); spinner.succeed("zh.js已清理完成".green); // 同步导入所有国际化文件 langList.forEach((lang) => { // 读取已经翻译的英文文件等 if (fs.existsSync(config.dir + lang + '.js')) { processFile = path.join(process.cwd(), config.dir + lang + '.js'); enData = require(processFile) Object.keys(delKey).forEach(key=>{ if(enData.hasOwnProperty(key)){ delete enData[key] } }) rootPath = path.join(process.cwd(), config.dir + lang + '.js'); fs.writeFileSync(rootPath, `module.exports = ${JSON.stringify(enData, null, '\t')};`, 'utf8'); spinner.succeed(`${lang}.js已清理完成`.green); } // 读取已经翻译的英文map文件等 if (fs.existsSync(config.dir + lang + '.js.map')) { processFile = path.join(process.cwd(), config.dir + lang + '.js.map'); enData = fs.readFileSync(processFile, 'utf8'); try { enData = JSON.parse(enData) Object.keys(delKey).forEach(key=>{ const value = delKey[key] if(enData.hasOwnProperty(value)){ delete enData[value] } }) rootPath = path.join(process.cwd(), config.dir + lang + '.js.map'); fs.writeFileSync(rootPath, JSON.stringify(enData, null, '\t'), 'utf8'); spinner.succeed(`${lang}.js.map已清理完成`.green); } catch (e) { enData = {} } } }) }