UNPKG

react-redux-boilerplate-scripts

Version:

react-boilerplate-app-scripts

195 lines (180 loc) 5.73 kB
#!/usr/bin/env node --harmony 'use strict'; const path = require("path"); const fs = require("fs-extra"); const xlsx = require("node-xlsx"); const chalk = require('chalk'); const util = require('react-boilerplate-app-utils'); const scriptsPackagename = 'react-boilerplate-app-scripts'; /** * 读取并生产多excel语言列表,同时会对比翻译后的ecxel(如果有新的文案,会列在最后) * @property dirs 指定文件夹中的所有子文件夹(子子孙孙) * @property allFiles 指定文件夹中的所有文件(子子孙孙) * @property langList 提取的语言文案列(文案可能重复) * @property uniqueLangList 提取的不重复的语言文案列表 */ class ReadAndGenerateLocaleExeclList { constructor( config ){ const packageJsonConfig = util.getCwdPackageJson()[scriptsPackagename]; if(!config) { config = { readDir: packageJsonConfig.appSrcPath || "src", excelSaveDir: `${ packageJsonConfig.appLocalePath }/excel` || "src/locale/excel", } } config = Object.assign({},{ saveNotUniqueLangPath: path.resolve(`${ config.excelSaveDir }/multi-language(file-position).xlsx`), saveUniqueLangPath: path.resolve(`${ config.excelSaveDir }/multi-language(no repetition).xlsx`), translatedLangPath: path.resolve(`${ config.excelSaveDir }/multi-language(translated).xlsx`), },config) this.config = config; this.dirs = []; this.allFiles = []; //根据package.json中的配置去顶默认语言 this.langList = [["position",packageJsonConfig.language]]; //不重复的语言文案列表 this.uniqueLangList = []; //和excel比较后语言文案列表 this.compareUniqueLangList = []; this.run(); } run(){ fs.ensureDirSync(path.resolve(this.config.excelSaveDir)); this.getAllFiles(path.resolve(this.config.readDir)); this.readAllFilesAndGetLocaleText(); this.getUniqueLocaleUText(); if(fs.existsSync(this.config.translatedLangPath)){ this.compareAndGetLangList(); }else { this.compareUniqueLangList = this.uniqueLangList; } this.generateExcel(); } /** * 获取指定文件夹所有文件,除去忽略的文件 */ getAllFiles(c_path){ if(!fs.existsSync(c_path)){ return; } try{ var files = fs.readdirSync(c_path) files && files.forEach(v=>{ //begin--------忽略处理 if(v.indexOf(".swp") != -1){ return; } if(v.indexOf(".swo") != -1){ return; } switch(v){ case "reducer.js": return; case "action.js": return; case ".DS_Store": return; } //end-------忽略处理 var filePath = path.resolve(c_path,v); var stat = fs.lstatSync(filePath); if(stat.isDirectory()){ this.dirs.push(filePath); this.getAllFiles(filePath); }else { this.allFiles.push(filePath); } }) }catch(e){ console.log(e) } } /** * 读取所有文件内容,获取语言文案列表(可能重复) */ readAllFilesAndGetLocaleText(){ this.allFiles.forEach((v,k)=>{ var short_path = v.split("src")[1]; var contents = fs.readFileSync(v,{ encoding : 'utf-8' }) //匹配r2fn.t("") var m = contents.match(/\.t\("(.*)"\)/g); m && m.forEach(v2=>{ var t = v2.split('"'); this.langList.push([short_path,t[1]]); }) //匹配r2fn.t('') var m = contents.match(/\.t\('(.*)'\)/g); m && m.forEach(v2=>{ var t = v2.split("'"); this.langList.push([short_path,t[1]]); }) }) } /** * 读取所有文件内容,获取语言文案列表(可能重复) */ getUniqueLocaleUText(){ var temp = []; this.langList.forEach(v=>{ if(temp.indexOf(v[1]) === -1){ temp.push(v[1]); this.uniqueLangList.push([v[1]]); } }) } /** * 读取excel文件内容 */ parseExcelFile(c_path){ var data; try{ data = xlsx.parse(c_path); }catch(e){ console.log(e) } //console.log(data[0].data) return data; } /** * 对比已存在的excel,获得语言最终列表 */ compareAndGetLangList(){ var data = this.parseExcelFile(this.config.translatedLangPath); var firstData = []; data[0].data.forEach(v=>{ firstData.push(v[0]); }) this.uniqueLangList.forEach((v,k)=>{ var index = firstData.indexOf(v[0]); if(index !== -1){ this.compareUniqueLangList.push(data[0].data[index]) } }) this.uniqueLangList.forEach((v,k)=>{ var index = firstData.indexOf(v[0]); if(index === -1){ this.compareUniqueLangList.push(v); } }) //console.log(this.compareUniqueLangList); //console.log(data[0].data.length,this.uniqueLangList.length,this.compareUniqueLangList.length); } /** * 生成Excel,给对应人员翻译 */ generateExcel(){ //console.log(this.compareUniqueLangList); var buffer = xlsx.build([{name: "multi-language", data: this.compareUniqueLangList}]); fs.writeFileSync(this.config.saveUniqueLangPath,buffer); fs.writeFileSync(this.config.translatedLangPath,buffer); var buffer2 = xlsx.build([{name: "multi-language", data: this.langList}]); fs.writeFileSync(this.config.saveNotUniqueLangPath,buffer2) console.log(chalk.green('Excel created successfully in ')); console.log(chalk.cyan(path.resolve(this.config.excelSaveDir))); } } module.exports = ReadAndGenerateLocaleExeclList; var obj = new ReadAndGenerateLocaleExeclList(); //console.log(obj.langList)