init命令会自动安装@voerkai18n/runtime

This commit is contained in:
wxzhang 2022-03-24 20:50:22 +08:00
parent 280e3f5433
commit 562c71a0a2
11 changed files with 91 additions and 44 deletions

6
.gitignore vendored
View File

@ -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

View File

@ -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`转码插件,用来对翻译文本进行自动转码

View File

@ -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(","))

View File

@ -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

View File

@ -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")

View File

@ -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"
}
}

View File

@ -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`实现初始化、文本提取和编译等命令

View File

@ -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
}

View File

@ -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`运行时依赖

3
pnpm-lock.yaml generated
View File

@ -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==}

View File

@ -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`