Spaces:
Build error
Build error
/* eslint-disable no-eval */ | |
const fs = require('node:fs') | |
const path = require('node:path') | |
const transpile = require('typescript').transpile | |
const magicast = require('magicast') | |
const { parseModule, generateCode, loadFile } = magicast | |
const bingTranslate = require('bing-translate-api') | |
const { translate } = bingTranslate | |
const data = require('./languages.json') | |
const targetLanguage = 'en-US' | |
// https://github.com/plainheart/bing-translate-api/blob/master/src/met/lang.json | |
const languageKeyMap = data.languages.reduce((map, language) => { | |
if (language.supported) { | |
if (language.value === 'zh-Hans' || language.value === 'zh-Hant') | |
map[language.value] = language.value | |
else | |
map[language.value] = language.value.split('-')[0] | |
} | |
return map | |
}, {}) | |
async function translateMissingKeyDeeply(sourceObj, targetObject, toLanguage) { | |
await Promise.all(Object.keys(sourceObj).map(async (key) => { | |
if (targetObject[key] === undefined) { | |
if (typeof sourceObj[key] === 'object') { | |
targetObject[key] = {} | |
await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage) | |
} | |
else { | |
const { translation } = await translate(sourceObj[key], null, languageKeyMap[toLanguage]) | |
targetObject[key] = translation | |
// console.log(translation) | |
} | |
} | |
else if (typeof sourceObj[key] === 'object') { | |
targetObject[key] = targetObject[key] || {} | |
await translateMissingKeyDeeply(sourceObj[key], targetObject[key], toLanguage) | |
} | |
})) | |
} | |
async function autoGenTrans(fileName, toGenLanguage) { | |
const fullKeyFilePath = path.join(__dirname, targetLanguage, `${fileName}.ts`) | |
const toGenLanguageFilePath = path.join(__dirname, toGenLanguage, `${fileName}.ts`) | |
const fullKeyContent = eval(transpile(fs.readFileSync(fullKeyFilePath, 'utf8'))) | |
// To keep object format and format it for magicast to work: const translation = { ... } => export default {...} | |
const readContent = await loadFile(toGenLanguageFilePath) | |
const { code: toGenContent } = generateCode(readContent) | |
const mod = await parseModule(`export default ${toGenContent.replace('export default translation', '').replace('const translation = ', '')}`) | |
const toGenOutPut = mod.exports.default | |
await translateMissingKeyDeeply(fullKeyContent, toGenOutPut, toGenLanguage) | |
const { code } = generateCode(mod) | |
const res = `const translation =${code.replace('export default', '')} | |
export default translation | |
`.replace(/,\n\n/g, ',\n').replace('};', '}') | |
fs.writeFileSync(toGenLanguageFilePath, res) | |
} | |
async function main() { | |
// const fileName = 'workflow' | |
// Promise.all(Object.keys(languageKeyMap).map(async (toLanguage) => { | |
// await autoGenTrans(fileName, toLanguage) | |
// })) | |
const files = fs | |
.readdirSync(path.join(__dirname, targetLanguage)) | |
.map(file => file.replace(/\.ts/, '')) | |
.filter(f => f !== 'app-debug') // ast parse error in app-debug | |
await Promise.all(files.map(async (file) => { | |
await Promise.all(Object.keys(languageKeyMap).map(async (language) => { | |
await autoGenTrans(file, language) | |
})) | |
})) | |
} | |
main() | |