diff --git a/scripts/extract-language.js b/scripts/extract-language.js index 24fe645f6aef1f75a71eb413a2c5e554c7c6217c..6a9df798ac54a59a9784ae480a5e07d15f5aa03a 100644 --- a/scripts/extract-language.js +++ b/scripts/extract-language.js @@ -5,78 +5,71 @@ const crypto = require('crypto') const fse = require('fs-extra') const shelljs = require('shelljs') -// 输入组件名称,例如 Input 组件, node scripts/extract-language.js Input -// 组件的 demo.tsx 中 demo 组件名字应该为 组件名称 + Demo,例如:InputDemo,CheckboxDemo 等 -const pkg = process.argv[2] - +// utils function unique(arr) { return Array.from(new Set(arr)) } -const locales = ['zh-CN', 'zh-TW', 'en-US'] - -let fileContent = fs - .readFileSync(path.join(process.cwd(), `src/packages/${pkg.toLocaleLowerCase()}/demo.tsx`)) - .toString() -console.log(fileContent.match(/([0-9a-z]*[\u4e00-\u9fa5]+[0-9]*[\u4e00-\u9fa5()()0-9a-z\/]*)/gi)) - -const zh_CN = unique( - fileContent.match(/([0-9a-z]*[\u4e00-\u9fa5]+[0-9]*[\u4e00-\u9fa5()()0-9a-z\/]*)/gi) -) - function hash(str) { const hash = crypto.createHash('sha256') hash.update(str) return hash.digest('hex').slice(0, 8) } -const lang = {} -const inter = [] +// 输入组件名称,例如 Input 组件, node scripts/extract-language.js Input +// 组件的 demo.tsx 中 demo 组件名字应该为 组件名称 + Demo,例如:InputDemo,CheckboxDemo 等 +const pkg = process.argv[2] +const locals = ['zh-CN', 'zh-TW', 'en-US'] + +const demoFile = path.join(process.cwd(), `src/packages/${pkg.toLocaleLowerCase()}/demo.tsx`) +let demoContent = fs.readFileSync(demoFile).toString() + +console.log(demoContent.match(/([0-9a-z]*[\u4e00-\u9fa5]+[0-9]*[\u4e00-\u9fa5()()0-9a-z\/]*)/gi)) -zh_CN.forEach((item) => { +const matchingChinese = /([0-9a-z]*[\u4e00-\u9fa5]+[0-9]*[\u4e00-\u9fa5()()0-9a-z\/]*)/gi +const unrepeatedChinese = unique(demoContent.match(matchingChinese)) + +const localTable = {} +const interfaceType = [] + +unrepeatedChinese.forEach((item) => { const k = hash(item) - lang[k] = item - inter.push(`"${k}": string`) + localTable[k] = item + interfaceType.push(`"${k}": string`) // 要处理重复 item = item.replace('(', '\\(').replace(')', '\\)').replace('(', '\\(').replace(')', '\\)') - fileContent = fileContent + demoContent = demoContent .replace(new RegExp(`=\"${item}\"`, 'g'), `={translated['${k}']}`) .replace(new RegExp(`>\\s*${item}\\s*<`, 'g'), `>{translated['${k}']}<`) .replace(new RegExp(`\'${item}\'`, 'g'), `translated['${k}']`) }) // interface -const interfaceTpl = `interface T { - ${inter.join('\n ')} +const interfaceTemplate = `interface T { + ${interfaceType.join('\n ')} }` -// console.log(interfaceTpl) const translate = {} -locales.forEach((item) => (translate[item] = lang)) -// hooks -const injectTpl = ` +locals.forEach((item) => (translate[item] = localTable)) +const translateHookTemplate = ` const [translated] = useTranslate(${JSON.stringify(translate, ' ', 2)}) ` -// console.log('const ${pkg}Demo = () => {') -fileContent = +demoContent = `import { useTranslate } from '../../sites/assets/locale'\n` + - fileContent.replace( + demoContent.replace( `const ${pkg}Demo = () => {`, ` - ${interfaceTpl} - + ${interfaceTemplate} const ${pkg}Demo = () => { - ${injectTpl} + ${translateHookTemplate} ` ) -// console.log(fileContent) - fse .outputFile( path.join(process.cwd(), `src/packages/${pkg.toLocaleLowerCase()}/demo.locale.tsx`), - fileContent, + demoContent, 'utf8' ) .then(() => {