const fs = require('fs'); let root let allFiles = [] function getFiles(dir){ if(fs.lstatSync(dir).isDirectory()){ let files = fs.readdirSync(dir) files.forEach(file => { let path = dir + '/' + file if(fs.lstatSync(path).isDirectory()){ getFiles(path) }else if(path.split('.').reverse()[0] === 'vue') { allFiles.push(path) } }) } else { allFiles.push(dir) } } root = process.argv.slice(2)[0] if (!root) { return console.log('需要带上文件或目录地址,例如:node .\\translator.js .\\src\\views\\ecw\\order\\warehousing\\') } getFiles(root) console.log('共' + allFiles.length + '个文件') allFiles.forEach(file => { let count = 0 let data = fs.readFileSync(file, {encoding: 'utf-8'}) // 找到 <template>([\w\W]*)<\/template> data = data.replace(/<template>([\w\W]*)<\/template>/g, (template) => { // 匹配标签属性 placeholder="请输入部门名称" 并替换为 :placeholder="$t('请输入部门名称')" return template.replace(/ \w+="[^\x00-\xff]+"/g, (word) => { count++ const wordList = word.split('=') return ' :' + wordList[0].substring(1) + '="$t(\'' + wordList[1].substring(1, wordList[1].length - 1) + '\')"' }) // 匹配标签值 <el-button>取 消</el-button> 并替换为 <el-button>{{ $t('取 消') }}</el-button> .replace(/>(\s*[^\x00-\xff]+\s*)+</g, (word) => { count++ return '>{{ $t(\'' + word.substring(1, word.length - 1).trim() + '\') }}<' }) }) // 找到 <script>([\w\W]*)<\/script> .replace(/<script>([\w\W]*)<\/script>/g, (script) => { // 单引号字符串 \'(\s*[^\x00-\xff]+\s*)+\' ,其中(?<!([(=]))和(?!\))表示前后没有括号和前=用于防止重复转换 let s = script.replace(/(?<!([(=]))(?<!(\$t\())'[^\x00-\xff]+'(?!\))/g, s => { count++ return 'this.$t(' + s + ')' }) // 双引号字符串 \"(\s*[^\x00-\xff]+\s*)+\" s = s.replace(/(?<!([(=]))"[^\x00-\xff]+"(?!\))/g, s => { count++ return 'this.$t(' + s + ')' }) // `字符串 \`(\s*[^\x00-\xff]+\s*)+\` s = s.replace(/(?<!([(=]))`[^\x00-\xff]+`(?!\))/g, s => { count++ return 'this.$t(' + s + ')' }) return s }) fs.writeFileSync(file, data) console.log('[' + file + ']修改' + count + '处') })