Bilibili-Evolved/webpack/inject-metadata/i18n.ts
2022-10-12 23:25:10 +08:00

48 lines
1.2 KiB
TypeScript

import { dirname } from 'path'
import { objectProperty, identifier } from '@babel/types'
import { parseExpression } from '@babel/parser'
import { readdirSync } from 'fs'
import { InjectMetadataAction } from './types'
/**
* 当入口文件 index.ts 旁边还有 index.{language}.ts 时, 将其作为 i18n 注入.
* 注意 index.ts 中原有的 i18n 会被覆盖.
*
* 例子:
* - index.ts
* - index.en-US.ts
*
* 可以自动在 index.ts 中的定义中注入 en-US 的 i18n
*/
export const injectI18n: InjectMetadataAction = ({ filename }) => {
const folder = dirname(filename)
const regex = /index\.(.+)\.ts$/
const matchedFiles = readdirSync(folder).filter(file => file.match(regex))
if (matchedFiles.length === 0) {
return []
}
return [
objectProperty(
identifier('i18n'),
parseExpression(
`
(() => {
const context = require.context('./', false, ${regex})
return {
...Object.fromEntries(context
.keys()
.map(path => {
const key = path.match(${regex})[1]
const value = context(path)
return [key, value]
})),
}
})()
`,
{ plugins: ['typescript'] },
),
),
]
}