提交 d8e2eab9 编写于 作者: O oasis-cloud

chore: 抽取中文文案

上级 ea234243
......@@ -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<T>(${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(() => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册