translator.js 2.4 KB
Newer Older
lanbaoming's avatar
lanbaoming committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
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 + '')
})