kdesign-i18n
Version: 
kd is from company of klx, it provide quickly genarator company inner business front structure
95 lines (92 loc) • 3.72 kB
JavaScript
const xlsx = require('node-xlsx')
const fs = require('fs')
const https = require('https')
const { resolve } = require('path')
const arg = process.argv.slice(2)
if (arg.length < 2) {
    throw new Error('参数必须传递文件地址和导出地址')
}
const data = xlsx.parse(resolve(process.cwd(), arg[0]))
class Data {
    get translate () {
        return new Translate
    }
    transfer (data = [], translate = false) {
        let resMap = new Map()
        return new Promise((resolve, reject) => {
            data.forEach(sheet => {
                let keyIndex, codeIndex, zhIndex
                sheet.data.forEach(async (row, index) => {
                    // 获取表头
                    if (index === 0) {
                        row.forEach((col, index) => {
                            let reg = /\:(.+)/, key = (col.match(reg) || [])[1]
                            if (key) {
                                if (/zh/i.test(key)) zhIndex = index
                                resMap.set(key, {
                                    index,
                                    data: {}
                                })
                            }
                            if (col === 'key') {
                                if (typeof keyIndex === 'number') {
                                    codeIndex = index
                                    return
                                }
                                keyIndex = index
                            }
                        })
                        return
                    }
                    if (index === sheet.data.length - 1) {
                        resolve(resMap)
                    }
                    if (!row.length) return
                    for (let iterator of resMap) {
                        let [key, data] = iterator, val = /zh/i.test(key) || !translate ? row[data.index] : await this.translate.transfer(row[zhIndex], key.match(/([^_]+)/)[1]).source
                        Object.assign(data.data[row[keyIndex]] || (data.data[row[keyIndex]] = {}), {
                            [row[codeIndex]]: val
                        })
                    }
                })
            })
        })
    }
}
class Write {
    write2local (path = __dirname, filename = '1.js', data) {
        fs.writeFileSync(`${path}/${filename}`, data)
    }
}
class Translate {
    transfer (text, target, source = 'zh-cn') {
        return new Promise((resolve, reject) => {
            console.log(`开始转换${text}`)
            https.get(`https://translate.googleapis.com/translate_a/single?client=gtx&sl=${source}&tl=${target}&dt=t&q=${encodeURIComponent(text)}`, (res) => {
                let data = ''
                res.on('data', (chunk) => {
                    data += chunk
                })
                res.on('end', chunk => {
                    try {
                        let json = JSON.parse(data.toString()), [[[target, source]]] = json
                        resolve({
                            target,
                            source
                        })
                    } catch (err) {
                        reject(err)
                    }
                })
            })
        })
    }
}
(new Data()).transfer(data).then(res => {
    let write = new Write()
    for (let iterator of res) {
        let [key, data] = iterator, str = `\/\* eslint-disable\*\/\n export default ${JSON.stringify(data.data, '', 2)}`.replace(/\"(require\([^"]+)\"/g, '$1')
        write.write2local(resolve(process.cwd(), arg[1]), `${key}.js`, str)
    }
})