UNPKG

@tenado/i18n-cli

Version:

i18n-cli是一个自动国际化脚本,通过执行命令,自动提取代码里面的中文,自动调用百度或谷歌翻译接口,自动将翻译结果以 key-value 形式存入*.json 语言包里

79 lines (76 loc) 2.71 kB
const Progress = require("progress"); const translate = require("./translate.js"); const sleep = require("../utils/sleep.js"); const saveTranslate = require("../utils/saveTranslate.js"); const getLangTranslates = require("../utils/getTranslate.js"); module.exports = async (options) => { const { type, interval = 1000 } = options?.translate ?? {}; const { langs, local } = options ?? {}; // 保存翻译后的内容 const batchTranslateResolve = (translates, keys, _translate) => { const len = translates.length; for (let i = 0; i < len; i++) { const text = translates[i]; const key = keys[i]; _translate[key] = text; } }; // 获取当前语言下需要翻译部分 const getNeedTranslate = (options, lang) => { const { local } = options ?? {}; let result = {}; const localObj = getLangTranslates(options, local); const langObj = getLangTranslates(options, lang); for (let key in localObj) { if (!langObj[key]) { result[key] = localObj[key]; } } return result; }; // 将需要翻译的语言内容存到配置里面 const langLen = langs.length; // 设置最大翻译字符串长度 const maxStringLen = 1000; const separator = "\n"; for (let i = 0; i < langLen; i++) { const lang = langs[i]; // 根据local和当前语言的对比,计算出needTranslate的值 let needTranslate = getNeedTranslate(options, lang); const keys = Object.keys(needTranslate); const keyLen = keys.length; const bar = new Progress(":bar :percent", { total: keyLen }); console.log(`开始翻译${lang}`); let _translate = {}; let collectText = []; let collectKey = []; let collectTextLength = 0; for (let j = 0; j < keyLen; j++) { const key = keys[j]; const text = needTranslate[key]; collectTextLength = collectTextLength + text.length + separator.length; collectText.push(text); collectKey.push(key); if (collectTextLength >= maxStringLen || j === keyLen - 1) { const translateText = collectText.join(separator); await sleep(interval); const res = await translate(type, translateText, lang, options); if (res) { let resArr = []; if (Object.prototype.toString.call(res) === "[object Array]") { resArr = res.map((item) => item); } else { resArr = res.split(separator); } batchTranslateResolve(resArr, collectKey, _translate); } collectText = []; collectKey = []; collectTextLength = 0; } bar.tick(); } // 将数据保存到文件 saveTranslate(options, lang, _translate); } };