From 562c71a0a2d40a4404cb570d4f11fba70edef934 Mon Sep 17 00:00:00 2001 From: wxzhang Date: Thu, 24 Mar 2022 20:50:22 +0800 Subject: [PATCH] =?UTF-8?q?init=E5=91=BD=E4=BB=A4=E4=BC=9A=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=AE=89=E8=A3=85@voerkai18n/runtime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +-- packages/babel/readme.md | 1 + packages/cli/compile.command.js | 3 +- packages/cli/index.js | 2 +- packages/cli/init.command.js | 22 +++++++++- packages/cli/package.json | 9 ++-- packages/cli/readme.md | 2 + packages/cli/utils.js | 77 ++++++++++++++++++++------------- packages/runtime/readme.md | 2 + pnpm-lock.yaml | 3 +- readme.md | 8 +++- 11 files changed, 91 insertions(+), 44 deletions(-) diff --git a/.gitignore b/.gitignore index 78e4cf5..7b7af42 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ /.vscode /node_modules node_modules -/packages/demo/apps/app/languages -/packages/demo/apps/*/languages -/packages/demo/*/node_modules +/demo/apps/app/languages +/demo/apps/*/languages +/demo/*/node_modules /coverage \ No newline at end of file diff --git a/packages/babel/readme.md b/packages/babel/readme.md index 11a870b..4a418c1 100644 --- a/packages/babel/readme.md +++ b/packages/babel/readme.md @@ -1,3 +1,4 @@ +[![fisher/voerka-i18n](https://gitee.com/zhangfisher/voerka-i18n/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/zhangfisher/voerka-i18n) # @voerkai18n/babel `Babel`转码插件,用来对翻译文本进行自动转码 diff --git a/packages/cli/compile.command.js b/packages/cli/compile.command.js index 5b366bf..de1f8d0 100644 --- a/packages/cli/compile.command.js +++ b/packages/cli/compile.command.js @@ -54,8 +54,7 @@ module.exports =async function compile(langFolder,opts={}){ const settingsFile = path.join(langFolder,"settings.js") try{ // 读取多语言配置文件 - const module =await importModule(`file:///${settingsFile}`) - const langSettings = module.default; + const langSettings = await importModule(settingsFile) let { languages,defaultLanguage,activeLanguage,namespaces } = langSettings logger.log(t("支持的语言\t: {}"),languages.map(item=>`${item.title}(${item.name})`).join(",")) diff --git a/packages/cli/index.js b/packages/cli/index.js index e55eccd..05ca5cc 100644 --- a/packages/cli/index.js +++ b/packages/cli/index.js @@ -73,7 +73,7 @@ program const langSettingsFile = path.join(location,"languages","settings.js") if(fs.existsSync(langSettingsFile)){ logger.log(t("语言配置文件<{}>已存在,将优先使用此配置文件中参数来提取文本","./languages/settings.js")) - let lngOptions = (await importModule("file:///"+langSettingsFile)).default + let lngOptions = await importModule(langSettingsFile) options.languages = lngOptions.languages options.defaultLanguage = lngOptions.defaultLanguage options.activeLanguage = lngOptions.activeLanguage diff --git a/packages/cli/init.command.js b/packages/cli/init.command.js index 5af2ec3..a4eebcf 100644 --- a/packages/cli/init.command.js +++ b/packages/cli/init.command.js @@ -4,12 +4,29 @@ */ -const { findModuleType,createPackageJsonFile,t } = require("./utils") +const { findModuleType,createPackageJsonFile,t,getCurrentProjectRootFolder } = require("./utils") const path = require("path") const fs = require("fs") +const shelljs = require("shelljs") const createLogger = require("logsets") const logger = createLogger() +/** + * 在当前工程自动安装@voerkai18n/runtime + * @param {*} langFolder + * @param {*} opts + */ + function installVoerkai18nRuntim(srcPath){ + const projectFolder = getCurrentProjectRootFolder(srcPath || process.cwd()) + if(fs.existsSync("pnpm-lock.yaml")){ + shelljs.exec("pnpm add @voerkai18n/runtime") + }else if(fs.existsSync("yarn.lock")){ + shelljs.exec("yarn add @voerkai18n/runtime") + }else{ + shelljs.exec("npm install @voerkai18n/runtime") + } +} + module.exports = function(srcPath,{debug = true,languages=["cn","en"],defaultLanguage="cn",activeLanguage="cn",moduleType = "auto",reset=false}={}){ // 语言文件夹名称 @@ -52,6 +69,9 @@ module.exports = function(srcPath,{debug = true,languages=["cn","en"],defaultLan }else{ fs.writeFileSync(settingsFile,`module.exports = ${JSON.stringify(settings,null,4)}`) } + // 自动安装运行时@voerkai18n/runtime + logger.log(t("正在安装多语言运行时:{}"),"@voerkai18n/runtime") + installVoerkai18nRuntim(srcPath) if(debug) { logger.log(t("生成语言配置文件:{}"),"./languages/settings.js") diff --git a/packages/cli/package.json b/packages/cli/package.json index feab41a..2f35c8e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@voerkai18n/cli", - "version": "1.0.1", + "version": "1.0.6", "description": "VoerkaI18n command line interactive tools", "main": "index.js", "homepage": "https://gitee.com/zhangfisher/voerka-i18n", @@ -25,20 +25,21 @@ "bin": { "voerkai18n": "./index.js", "publish": "npm publish -access public" - }, + }, "dependencies": { "@babel/cli": "^7.17.6", "@babel/core": "^7.17.5", "@voerkai18n/runtime": "workspace:^1.0.0", "art-template": "^4.13.2", "commander": "^9.0.0", + "cross-env": "^7.0.3", "deepmerge": "^4.2.2", "glob": "^7.2.0", "gulp": "^4.0.2", "logsets": "^1.0.8", "readjson": "^2.2.2", + "shelljs": "^0.8.5", "through2": "^4.0.2", - "vinyl": "^2.2.1", - "cross-env": "^7.0.3" + "vinyl": "^2.2.1" } } diff --git a/packages/cli/readme.md b/packages/cli/readme.md index b0a8b29..42c3de4 100644 --- a/packages/cli/readme.md +++ b/packages/cli/readme.md @@ -1,3 +1,5 @@ +[![fisher/voerka-i18n](https://gitee.com/zhangfisher/voerka-i18n/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/zhangfisher/voerka-i18n) + # VoerkaI18n命令行工具 `@VoerkaI18n/cli`实现初始化、文本提取和编译等命令 diff --git a/packages/cli/utils.js b/packages/cli/utils.js index 9e797bb..7f9e9e6 100644 --- a/packages/cli/utils.js +++ b/packages/cli/utils.js @@ -11,20 +11,56 @@ async function importModule(url,onlyDefault=true) { } } + + + /** + * 返回当前项目根文件夹 + * 从指定文件夹folder向上查找package.json + * @param {*} folder + */ + function getCurrentProjectRootFolder(folder,exclueCurrent=false){ + try{ + const pkgFile =exclueCurrent ? + path.join(folder, "..", "package.json") + : path.join(folder, "package.json") + if(fs.existsSync(pkgFile)){ + return path.dirname(pkgFile) + } + const parent = path.dirname(folder) + if(parent===folder) return null + return getCurrentProjectRootFolder(parent,false) + }catch(e){ + return null + } +} + + +/** + * 读取指定文件夹的package.json文件,如果当前文件夹没有package.json文件,则向上查找 + * @param {*} folder + * @param {*} exclueCurrent =true 排除folder,从folder的父级开始查找 + * @returns + */ +function getCurrentPackageJson(folder,exclueCurrent=true){ + let projectFolder = getCurrentProjectRootFolder(folder,exclueCurrent) + if( projectFolder){ + return readJson.sync(path.join(projectFolder, "package.json")) + } +} + +/** + * + * 返回当前项目的模块类型 + * * 从当前文件夹开始向上查找package.json文件,并解析出语言包的类型 + * * @param {*} folder */ function findModuleType(folder){ - try{ - let pkgPath = path.join(folder, "package.json") - if(fs.existsSync(pkgPath)){ - let pkg = readJson.sync(pkgPath) - return pkg.type || "commonjs" - } - let parent = path.dirname(folder) - if(parent===folder) return null - return findModuleType(parent) + let packageJson = getCurrentPackageJson(folder) + try{ + return packageJson.type || "commonjs" }catch(e){ return "esm" } @@ -32,28 +68,6 @@ async function importModule(url,onlyDefault=true) { -/** - * 读取指定文件夹的package.json文件,如果当前文件夹没有package.json文件,则向上查找 - * @param {*} folder - * @param {*} exclueSelf =true 排除folder,从folder的父级开始查找 - * @returns - */ -function getCurrentPackageJson(folder,exclueSelf=true){ - try{ - let pkgPath =exclueSelf ? - path.join(folder, "..", "package.json") - : path.join(folder, "package.json") - if(fs.existsSync(pkgPath)){ - let pkg = readJson.sync(pkgPath) - return pkg - } - let parent = path.dirname(folder) - if(parent===folder) return null - return getCurrentPackageJson(parent,false) - }catch(e){ - return null - } -} function createPackageJsonFile(targetPath,moduleType="auto"){ if(moduleType==="auto"){ @@ -172,6 +186,7 @@ module.exports = { createPackageJsonFile, isPlainObject, getCurrentPackageJson, + getCurrentProjectRootFolder, escape, t } diff --git a/packages/runtime/readme.md b/packages/runtime/readme.md index 135e060..ab2e654 100644 --- a/packages/runtime/readme.md +++ b/packages/runtime/readme.md @@ -1,3 +1,5 @@ +[![fisher/voerka-i18n](https://gitee.com/zhangfisher/voerka-i18n/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/zhangfisher/voerka-i18n) + # @voerkai18n/runtime `voerkai18n`运行时依赖 \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3aeb1e..0ffc825 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,7 @@ importers: gulp: ^4.0.2 logsets: ^1.0.8 readjson: ^2.2.2 + shelljs: ^0.8.5 through2: ^4.0.2 vinyl: ^2.2.1 dependencies: @@ -64,6 +65,7 @@ importers: gulp: 4.0.2 logsets: 1.0.8 readjson: 2.2.2 + shelljs: 0.8.5 through2: 4.0.2 vinyl: 2.2.1 @@ -5047,7 +5049,6 @@ packages: glob: 7.2.0 interpret: 1.4.0 rechoir: 0.6.2 - dev: true /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} diff --git a/readme.md b/readme.md index 0698267..7a9f2ee 100644 --- a/readme.md +++ b/readme.md @@ -20,7 +20,7 @@ - 符合直觉,不需要手动定义文本`Key`映射。 -- 完整的自动化工具链支持,包括项目初始化、提取文本、编码语言等。 +- 完整的自动化工具链支持,包括项目初始化、提取文本、编译语言等。 - 支持`babel`插件自动导入t翻译函数。 @@ -1041,14 +1041,20 @@ module.exports = { **说明:** - 您也可以手动自行创建`languages/settings.js`、`languages/package.json`文件。这样就不需运行`voerkai18n init`命令了。 + - 如果你的源码放在`src`文件夹,则需要在`src`文件夹下执行`init`命令。 + - `voerkai18n init`是可选的,直接使用`extract`时也会自动创建相应的文件。 + - `-m`参数用来指定生成的`settings.js`的模块类型: - 当`-m=auto`时,会自动读取前工程`package.json`中的`type`字段 - 当`-m=esm`时,会生成`ESM`模块类型的`settings.js`。 - 当`-m=cjs`时,会生成`commonjs`模块类型的`settings.js`。 + - `location`参数是可选的,如果没有指定则采用当前目录。 + 如果你想将`languages`安装在`src/languages`下,则可以指定`voerkai18n init ./src` + ## extract 扫描提取当前项目中的所有源码,提取出所有需要翻译的文本内容并保存在到`<工程源码目录>/languages/translates/*.json`。