init命令会自动安装@voerkai18n/runtime
This commit is contained in:
parent
280e3f5433
commit
562c71a0a2
6
.gitignore
vendored
6
.gitignore
vendored
@ -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
|
@ -1,3 +1,4 @@
|
||||
[](https://gitee.com/zhangfisher/voerka-i18n)
|
||||
# @voerkai18n/babel
|
||||
|
||||
`Babel`转码插件,用来对翻译文本进行自动转码
|
||||
|
@ -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(","))
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
[](https://gitee.com/zhangfisher/voerka-i18n)
|
||||
|
||||
# VoerkaI18n命令行工具
|
||||
|
||||
`@VoerkaI18n/cli`实现初始化、文本提取和编译等命令
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
[](https://gitee.com/zhangfisher/voerka-i18n)
|
||||
|
||||
# @voerkai18n/runtime
|
||||
|
||||
`voerkai18n`运行时依赖
|
3
pnpm-lock.yaml
generated
3
pnpm-lock.yaml
generated
@ -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==}
|
||||
|
@ -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`。
|
||||
|
Loading…
x
Reference in New Issue
Block a user