gulpfile.js 5.23 KiB
Newer Older
import path from 'path'
import { readFileSync, writeFileSync, accessSync, R_OK, W_OK, readdirSync, statSync } from 'fs'
import gulp from 'gulp'
import { ensureDirSync, ensureFileSync } from 'fs-extra/esm'
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const { join, basename, extname } = path
const { task } = gulp
Somnath Ghorpade's avatar
Somnath Ghorpade committed

let objToWrite = {}
let paths = {
  langFolder: join(__dirname, 'src/lang/'),
  srcFolder: join(__dirname, 'src/')
task('geni18n', function (done) {
Somnath Ghorpade's avatar
Somnath Ghorpade committed
  // let projPath = readlineSync.question("Please enter project path (path of 'src' folder)  ")
  // projPath = projPath + '/'
  let projPath = paths.srcFolder
  readPrevi18n()
  backUpI18nFile(projPath)
  i18nGenerator(projPath, ['en'], 'en')
  done()
})

function backUpI18nFile (projPath) {
  let d = new Date()
  let dformat = [paddingZero(d.getDate()), paddingZero(d.getMonth() + 1),
    paddingZero(d.getFullYear())].join('_') + '_' +
    [paddingZero(d.getHours()),
      paddingZero(d.getMinutes()),
      paddingZero(d.getSeconds()), paddingZero(d.getMilliseconds())].join('_')
  let backUpFolderPath = paths.langFolder + 'backup'
  let backUpFilePath = backUpFolderPath + '/en_' + dformat + '.json'
  try {
    ensureDirSync(backUpFolderPath)
Somnath Ghorpade's avatar
Somnath Ghorpade committed
  } catch (error) {
    console.log('Cannot create backup folder...')
  }
  let enFilePath = paths.langFolder + 'en.json'
  let content = readFileSync(enFilePath, 'utf8')
  writeFileSync(backUpFilePath, JSON.parse(JSON.stringify(content)))
Somnath Ghorpade's avatar
Somnath Ghorpade committed
}

function paddingZero (number) {
  if (number <= 9) {
    let temp = '0' + number.toString()
    return temp
  }
  return number.toString()
}

function createDvJson (projPath, objToWrite) {
  for (let key in objToWrite) {
    if (typeof objToWrite[key] === 'object') {
      let temp = objToWrite[key]
      for (let newKey in temp) {
        if (temp.hasOwnProperty(newKey)) {
          temp[newKey] = newKey
        }
      }
    }
  }
  let dvFilePath = paths.langFolder + 'dv.json'
  writeFileSync(dvFilePath, JSON.stringify(objToWrite))
Somnath Ghorpade's avatar
Somnath Ghorpade committed
}

function readPrevi18n () {
  let enFilePath = paths.langFolder + 'en.json'
  try {
    accessSync(enFilePath, R_OK | W_OK)
    let content = readFileSync(enFilePath, 'utf8')
Somnath Ghorpade's avatar
Somnath Ghorpade committed
    objToWrite = JSON.parse(content)
  } catch (e) {
    console.log('en.json file is missing...')
    ensureFileSync(enFilePath)
Somnath Ghorpade's avatar
Somnath Ghorpade committed
    console.log('Created en.json file...')
    objToWrite = {}
  }
}

function i18nGenerator (projPath, langArray, defaultLanguage) {
  let fileList = walkSync(projPath)
  let flag = 0
  let i
  let len = fileList.length
  let regexString = `([$]t[(]('|")##(.+?)##)(\\s*\\s*)(@@([\\s\\S]*?)@@('|")[)])`
  let regex = new RegExp(regexString, 'gi')

  if (fileList != null && fileList !== undefined && fileList.length > 0) {
    for (i = 0; i < fileList.length; i++) {
      flag++
      if (flag === len) {
        let fileList = walkSync(projPath)
        let i; let len = fileList.length
        if (fileList !== null && fileList !== undefined && fileList.length > 0) {
          for (i = 0; i < len; i++) {
            let file = fileList[i]
            let keyPrefix = basename(file).split('.')[0]
            let content = readFileSync(file, 'utf8')
Somnath Ghorpade's avatar
Somnath Ghorpade committed
            let i18nContentsToBeReplaced = content.match(regex)
            let translatedAdded = content
            if (i18nContentsToBeReplaced != null && i18nContentsToBeReplaced !== '' && i18nContentsToBeReplaced !== undefined && i18nContentsToBeReplaced.length > 0) {
              for (let j = 0; j < i18nContentsToBeReplaced.length; j++) {
                let extractKeyFrom = i18nContentsToBeReplaced[j].toString()
                let key = extractKeyFrom.substring(extractKeyFrom.indexOf('##') + 2, extractKeyFrom.lastIndexOf('##')).trim()
                let value = extractKeyFrom.substring(extractKeyFrom.indexOf('@@') + 2, extractKeyFrom.lastIndexOf('@@')).trim()
                // let replacement = "{{'" + key + "' | translate}}";
                let replacement = "$t('" + keyPrefix + '.' + key + "')"
                // console.log('keyPrefix + key', keyPrefix, key)
                translatedAdded = translatedAdded.replace(extractKeyFrom, replacement)
                prepareI18nObject(keyPrefix, key, value)
              }
              writeFileSync(file, translatedAdded)
Somnath Ghorpade's avatar
Somnath Ghorpade committed
            }
            if (i === (len - 1)) {
              console.log('\n\n')
              console.log('Internationalization successfully done on ' + (i + 1) + ' files')
              console.log('\n\n')
              let enFilePath = paths.langFolder + 'en.json'
              writeFileSync(enFilePath, JSON.stringify(objToWrite))
Somnath Ghorpade's avatar
Somnath Ghorpade committed
              createDvJson(projPath, objToWrite)
            }
          }
        }
      }
    }
  }
}

let walkSync = function (dir, filelist) {
  let files = readdirSync(dir)
Somnath Ghorpade's avatar
Somnath Ghorpade committed
  filelist = filelist || []
  files.forEach(function (file) {
    if (statSync(dir + file).isDirectory()) {
Somnath Ghorpade's avatar
Somnath Ghorpade committed
      filelist = walkSync(dir + file + '/', filelist)
    } else {
      if (extname(file) === '.vue') {
Somnath Ghorpade's avatar
Somnath Ghorpade committed
        filelist.push(dir + file)
      }
    }
  })
  return filelist
}

function prepareI18nObject (keyPrefix, key, value) {
  if (!objToWrite.hasOwnProperty(keyPrefix)) {
    objToWrite[keyPrefix] = {}
  }
  let parentObj = objToWrite[keyPrefix]
  parentObj[key] = value
}