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

chore: 抽取中文文案

上级 ea234243
...@@ -5,78 +5,71 @@ const crypto = require('crypto') ...@@ -5,78 +5,71 @@ const crypto = require('crypto')
const fse = require('fs-extra') const fse = require('fs-extra')
const shelljs = require('shelljs') const shelljs = require('shelljs')
// 输入组件名称,例如 Input 组件, node scripts/extract-language.js Input // utils
// 组件的 demo.tsx 中 demo 组件名字应该为 组件名称 + Demo,例如:InputDemo,CheckboxDemo 等
const pkg = process.argv[2]
function unique(arr) { function unique(arr) {
return Array.from(new Set(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) { function hash(str) {
const hash = crypto.createHash('sha256') const hash = crypto.createHash('sha256')
hash.update(str) hash.update(str)
return hash.digest('hex').slice(0, 8) return hash.digest('hex').slice(0, 8)
} }
const lang = {} // 输入组件名称,例如 Input 组件, node scripts/extract-language.js Input
const inter = [] // 组件的 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) const k = hash(item)
lang[k] = item localTable[k] = item
inter.push(`"${k}": string`) interfaceType.push(`"${k}": string`)
// 要处理重复 // 要处理重复
item = item.replace('(', '\\(').replace(')', '\\)').replace('', '\\').replace('', '\\') item = item.replace('(', '\\(').replace(')', '\\)').replace('', '\\').replace('', '\\')
fileContent = fileContent demoContent = demoContent
.replace(new RegExp(`=\"${item}\"`, 'g'), `={translated['${k}']}`) .replace(new RegExp(`=\"${item}\"`, 'g'), `={translated['${k}']}`)
.replace(new RegExp(`>\\s*${item}\\s*<`, 'g'), `>{translated['${k}']}<`) .replace(new RegExp(`>\\s*${item}\\s*<`, 'g'), `>{translated['${k}']}<`)
.replace(new RegExp(`\'${item}\'`, 'g'), `translated['${k}']`) .replace(new RegExp(`\'${item}\'`, 'g'), `translated['${k}']`)
}) })
// interface // interface
const interfaceTpl = `interface T { const interfaceTemplate = `interface T {
${inter.join('\n ')} ${interfaceType.join('\n ')}
}` }`
// console.log(interfaceTpl)
const translate = {} const translate = {}
locales.forEach((item) => (translate[item] = lang)) locals.forEach((item) => (translate[item] = localTable))
// hooks const translateHookTemplate = `
const injectTpl = `
const [translated] = useTranslate<T>(${JSON.stringify(translate, ' ', 2)}) const [translated] = useTranslate<T>(${JSON.stringify(translate, ' ', 2)})
` `
// console.log('const ${pkg}Demo = () => {')
fileContent = demoContent =
`import { useTranslate } from '../../sites/assets/locale'\n` + `import { useTranslate } from '../../sites/assets/locale'\n` +
fileContent.replace( demoContent.replace(
`const ${pkg}Demo = () => {`, `const ${pkg}Demo = () => {`,
` `
${interfaceTpl} ${interfaceTemplate}
const ${pkg}Demo = () => { const ${pkg}Demo = () => {
${injectTpl} ${translateHookTemplate}
` `
) )
// console.log(fileContent)
fse fse
.outputFile( .outputFile(
path.join(process.cwd(), `src/packages/${pkg.toLocaleLowerCase()}/demo.locale.tsx`), path.join(process.cwd(), `src/packages/${pkg.toLocaleLowerCase()}/demo.locale.tsx`),
fileContent, demoContent,
'utf8' 'utf8'
) )
.then(() => { .then(() => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册