diff --git a/packages/demo/apps/app/package.json b/packages/demo/apps/app/package.json index 504c663..96ae6e5 100644 --- a/packages/demo/apps/app/package.json +++ b/packages/demo/apps/app/package.json @@ -1,15 +1,3 @@ { - "name": "app", - "version": "1.0.0", - "description": "", - "main": "index.js", - "type": "module", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "@voerkai18n/tools": "workspace:^1.0.0" - } -} + "type": "module" +} \ No newline at end of file diff --git a/packages/tools/extract.command.js b/packages/tools/extract.command.js new file mode 100644 index 0000000..a54aaac --- /dev/null +++ b/packages/tools/extract.command.js @@ -0,0 +1,36 @@ +const { findModuleType } = require("./utils") +const path = require("path") +const fs = require("fs") +const gulp = require("gulp") +const createLogger = require("logsets") +const logger = createLogger() + + +module.exports = function(targetPath,options={}){ + let { filetypes,exclude} = options + if(!filetypes) filetypes = ["*.js","*.json","*.jsx","*.ts","*.tsx","*.vue","*.html"] + if(!Array.isArray(filetypes)) filetypes = filetypes.split(",") + const folders = filetypes.map(ftype=>{ + if(ftype.startsWith(".")) ftype = "*"+ftype + if(!ftype.startsWith("*.")) ftype = "*."+ftype + return path.join(targetPath,ftype) + }) + folders.push(`!${path.join(targetPath,"languages")}`) + folders.push(`!${path.join(targetPath,"node_modules")}`) + folders.push(`!${path.join(targetPath,"**","node_modules","**")}`) + // 排除文件夹 + console.log("exclude",exclude) + if(!Array.isArray(exclude) && exclude){ + exclude = exclude.split(",") + } + if(exclude){ + exclude.forEach(folder=>{ + folders.push(`!${path.join(targetPath,folder)}`) + }) + } + + console.log(folders) + + + //gulp.src(path.join(targetPath,"**/*.json")) +} \ No newline at end of file diff --git a/packages/tools/index.js b/packages/tools/index.js index ff52591..7db69ae 100644 --- a/packages/tools/index.js +++ b/packages/tools/index.js @@ -1,6 +1,9 @@ const { Command } = require('commander'); const createLogger = require("logsets") - +const path = require("path") +const fs = require("fs"); +const { importModule } = require('./utils'); +const deepmerge = require('deepmerge'); const logger = createLogger() const program = new Command(); @@ -13,12 +16,16 @@ program .argument('[location]', '工程项目所在目录') .description('初始化项目国际化配置') .option('-r, --reset', '重新生成当前项目的语言配置') - .option('-p, --langPath [name]', '语言包保存路径,默认/langauges',"languages") .option('-m, --moduleType [type]', '生成的js模块类型,默认esm',"esm") .option('-lngs, --languages ', '支持的语言列表', ['cn','en']) .action((location,options) => { - if(!location) location = process.cwd() - const initializer = require("./initializer") + if(!location) { + location = process.cwd() + }else{ + location = path.join(process.cwd(),location) + } + logger.log("工程目录:{}",location) + const initializer = require("./init.command") options.debug=true initializer(location,options) }); @@ -27,16 +34,38 @@ program program .command('extract') .description('扫描并提取所有待翻译的字符串到文件夹中') - .argument('[location]', 'js项目所在目录') .option('-d, --debug', '输出调试信息') - .option('-ls, --languages', '支持的语言', 'cn,en,de,fr,es,it,jp') - .option('-d, --default', '默认语言', 'cn') - .option('-a, --active', '激活语言', 'cn') - .option('-o, --output', '输出目录', './languages') - .argument('', '工程所在目录') - .action((location) => { - if(!location) location = process.cwd() - console.log('location=',location); + .option('-lngs, --languages', '支持的语言', 'cn,en,de,fr,es,it,jp') + .option('-d, --defaultLanguage', '默认语言', 'cn') + .option('-a, --activeLanguage', '激活语言', 'cn') + .option('-ns, --namespaces', '翻译名称空间') + .option('-e, --exclude ', '排除要扫描的文件夹,多个用逗号分隔') + .option('-u, --updateMode', '本次提取内容与已存在内容的数据合并策略,默认取值sync=同步,overwrite=覆盖,merge=合并', 'sync') + .option('-f, --filetypes', '要扫描的文件类型', 'js,vue,html,jsx,ts') + .argument('[location]', '工程所在目录',"./") + .action(async (location,options) => { + if(!location) { + location = process.cwd() + }else{ + location = path.join(process.cwd(),location) + } + if(options.languages){ + options.languages = options.languages.split(",").map(l=>({name:l,title:l})) + } + //options = Object.assign({},options) + logger.log("工程目录:{}",location) + const langSettingsFile = path.join(location,"languages","settings.js") + if(fs.existsSync(langSettingsFile)){ + logger.log("语言配置文件<{}>已存在.将优先使用此配置文件中参数来提取文本",langSettingsFile) + let lngOptions = (await importModule("file:///"+langSettingsFile)).default + options.languages = lngOptions.languages + options.defaultLanguage = lngOptions.defaultLanguage + options.activeLanguage = lngOptions.activeLanguage + options.namespaces = lngOptions.namespaces + } + + const extractor = require('./extract.command'); + extractor(location,options) }); diff --git a/packages/tools/initializer.js b/packages/tools/init.command.js similarity index 62% rename from packages/tools/initializer.js rename to packages/tools/init.command.js index f55a019..8432e51 100644 --- a/packages/tools/initializer.js +++ b/packages/tools/init.command.js @@ -10,8 +10,11 @@ const fs = require("fs") const createLogger = require("logsets") const logger = createLogger() -module.exports = function(targetPath,{debug = true, langPath = "languages",languages=["cn","en"],defaultLanguage="cn",activeLanguage="cn",moduleType = "auto",reset=false}={}){ +module.exports = function(targetPath,{debug = true,languages=["cn","en"],defaultLanguage="cn",activeLanguage="cn",moduleType = "auto",reset=false}={}){ + // 语言文件夹名称 + const langPath = "languages" // 查找当前项目的语言包类型路径 + if(moduleType==="auto"){ moduleType = findModuleType(targetPath) } @@ -41,11 +44,21 @@ module.exports = function(targetPath,{debug = true, langPath = "languages",langu activeLanguage, namespaces:{} } + const packageJsonFile = path.join(targetPath,"languages","package.json") if(["esm","es"].includes(moduleType)){ fs.writeFileSync(settingsFile,`export default ${JSON.stringify(settings,null,4)}`) + fs.writeFileSync(packageJsonFile,JSON.stringify({type:"module"},null,4)) }else{ fs.writeFileSync(settingsFile,`module.exports = ${JSON.stringify(settings,null,4)}`) + fs.writeFileSync(packageJsonFile,JSON.stringify({},null,4)) } - if(debug) logger.log("创建语言配置文件<{}>成功",settingsFile) + if(debug) { + logger.log("生成语言配置文件:{}","./languages/settings.js") + logger.log("拟支持的语言:{}",settings.languages.map(l=>l.name).join(",")) + logger.log("下一步:") + logger.log(" - 编辑{}确定拟支持的语言种类等参数","languages/settings.js") + logger.log(" - 运行<{}>扫描提取要翻译的文本","voerkai18n extract") + logger.log(" - 运行<{}>编译语言包","voerkai18n compile") + } } \ No newline at end of file diff --git a/packages/tools/package.json b/packages/tools/package.json index d1b88f1..c0c34f4 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -8,7 +8,7 @@ }, "author": "", "bin": { - "voerkai18n": "./index.js" + "voerkai18n": "./index.js" }, "license": "ISC", "dependencies": { @@ -17,15 +17,12 @@ "@voerkai18n/runtime": "workspace:^1.0.0", "art-template": "^4.13.2", "commander": "^9.0.0", + "deepmerge": "^4.2.2", "glob": "^7.2.0", - "logsets": "^1.0.6", + "gulp": "^4.0.2", + "logsets": "^1.0.7", "readjson": "^2.2.2", "through2": "^4.0.2", - "deepmerge": "^4.2.2", - "gulp": "^4.0.2", "vinyl": "^2.2.1" - }, - "devDependencies": { - } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46c1590..699b7e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,7 +94,7 @@ importers: deepmerge: ^4.2.2 glob: ^7.2.0 gulp: ^4.0.2 - logsets: ^1.0.6 + logsets: ^1.0.7 readjson: ^2.2.2 through2: ^4.0.2 vinyl: ^2.2.1 @@ -107,7 +107,7 @@ importers: deepmerge: 4.2.2 glob: 7.2.0 gulp: 4.0.2 - logsets: 1.0.6 + logsets: 1.0.7 readjson: 2.2.2 through2: 4.0.2 vinyl: 2.2.1 @@ -4166,8 +4166,8 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true - /logsets/1.0.6: - resolution: {integrity: sha512-tTtHpJ2pEVC3goIfqswDIaY5wwImPpfkfdKAcuQ6F6KdaDW3HvftL3X5WyFYAn02Ig/MPnLzgd/6DPm+ewFr3g==} + /logsets/1.0.7: + resolution: {integrity: sha512-O9VFAcMEuUY1tyq81hdZada+77fLl2Ff602AhlKpEpVr3gMyPFM67tILlBZZgnCfcmoRUo6nwhl26xXURHPH0A==} dependencies: '@babel/runtime-corejs3': registry.npmmirror.com/@babel/runtime-corejs3/7.17.2 ansicolor: registry.npmmirror.com/ansicolor/1.1.100