@voerkai18n/cli
Version:
命令行工具,用来初始化/提取/编译/自动翻译等工具链
80 lines (68 loc) • 2.74 kB
JavaScript
const fs = require("node:fs")
const path = require("node:path")
const glob = require("fast-glob")
const { t } = require("../../i18n");
const { readFile, writeFile } = require('flex-tools/fs/nodefs');
const htmlParser = require("node-html-parser")
const { translateParagraph } = require("./translate");
const { getDir } = require("@voerkai18n/utils");
async function translateFileParagraphs(file){
const { defaultLanguage,languages,language,tasks,typescript:isTypeScript,moduleType } = this
const paragraph = await readFile(file,{ encoding: "utf-8" })
const paragraphDoc = htmlParser.parse(paragraph,{comment:true})
const defaultLangParagraphEle = paragraphDoc.querySelector(`div[language="${defaultLanguage}"]`)
const codeFileExtName = isTypeScript ? ".ts" : ".js"
const lngs = language ? [{name:language}] : languages
let updatedCount = 0
for(let lng of lngs ){
if(lng.name === defaultLanguage) continue
let task
try{
task = tasks.add(t("翻译 {} -> {}"),[defaultLanguage,lng.name])
this.task = task
const langParagraphEle = paragraphDoc.querySelector(`div[language=${lng.name}]`)
if(!langParagraphEle){
paragraphDoc.appendChild(`\n<div language="${lng.name}">\n${defaultLangParagraphEle && defaultLangParagraphEle.innerHTML}\n</div>`)
}
if(langParagraphEle.getAttribute("done")) {
task.skip()
continue
}
const translated = await translateParagraph.call(this, langParagraphEle.innerHTML,defaultLanguage,lng.name)
if(translated){
langParagraphEle.innerHTML = "\n" + translated + "\n"
langParagraphEle.setAttribute("done",true)
task.complete()
updatedCount++
}else{
task.skip()
}
}catch(e){
task.error(e)
}
}
if(updatedCount>0){
await writeFile(file,paragraphDoc.innerHTML)
}
}
/**
*
* 翻译段落
*
*/
async function translateParagraphs(){
const { langDir,tasks } = this
const paragraphsDir = getDir(path.join(langDir,"translates","paragraphs"))
const files = await glob(["*.html"],{
cwd : paragraphsDir,
absolute: true
})
for(let file of files){
const relFile= path.relative(process.cwd(),file)
tasks.addGroup(t("翻译{}"),relFile)
await translateFileParagraphs.call(this,file)
}
}
module.exports = {
translateParagraphs
}