UNPKG

i18n-ai-trans

Version:

i18n-translate 是一个高效、简介的多语言翻译工具,安装后只需简单几步就能实现整个多语言文本的快速翻译。

73 lines (64 loc) 3.08 kB
const fs = require("fs") const path = require("path") const progress = require("process") const { getMissContent, setMissContent, getLanguageContent, getLangStat, setLanguageContent } = require('./utils') const { translate } = require("./translate") const { execQueue } = require("./queue") const exec = async (config) => { const { translateDir, SERVER_URL, API_KEY, SystemContent, ENDPOINT_ID, sourceLang = 'en', langs = ['en', 'zh'], chunkSize = 100, eolLine = false } = config const absDir = path.join(progress.cwd(), translateDir) if (!fs.statSync(absDir).isDirectory()) throw '找不到需要翻译的目录:' + absDir const { isDir, isFile } = getLangStat(absDir, sourceLang) if (!isDir && !isFile) throw `找不到 ${sourceLang} 需要翻译内容` const translateLangs = langs.filter(item => item !== sourceLang) // 获取源语言(一般是英文)内容 let enSourceObj = getLanguageContent(absDir, sourceLang) const enContent = Object.fromEntries(Object.entries(enSourceObj).filter(([_, value]) => value !== "")); const translateContents = translateLangs.map(lang => { // 获取翻译语言的内容 const langContent = getLanguageContent(absDir, lang); // 只需要翻译缺失和未翻译的字段 const translateContent = getMissContent(enContent, langContent); const translateContentLength = Object.keys(translateContent??{}).length; const isLong = translateContentLength > chunkSize; return { lang, langContent, translateContent, translateContentLength, isLong, async doUpdate() { if (!translateContent) { console.log(`${lang} 尚未发现新增文本`); return; } console.log(`${lang} 开始更新`); const [translatorData, error] = await translate({ SERVER_URL: SERVER_URL || 'https://llm-hub.parcelpanel.com/v1/chat/completions', API_KEY, ENDPOINT_ID, SystemContent, lang, translateContent, chunkSize }); if (translatorData) { // 填充翻译内容 setMissContent(langContent, translatorData); // 写入新的文件内容 setLanguageContent(absDir, lang, isDir, langContent, eolLine); console.log(`${lang} 更新成功`); } else { console.log(`${lang} 更新失败`, error); } } } }) const shortTranslateContents = translateContents.filter(item => !item.isLong).map(item => item.doUpdate); const longTranslateContents = translateContents.filter(item => item.isLong).map(item => item.doUpdate); await execQueue(shortTranslateContents, 8); await execQueue(longTranslateContents, 3); } module.exports = { exec }