init命令会自动安装@voerkai18n/runtime
This commit is contained in:
parent
280e3f5433
commit
562c71a0a2
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,7 +1,7 @@
|
|||||||
/.vscode
|
/.vscode
|
||||||
/node_modules
|
/node_modules
|
||||||
node_modules
|
node_modules
|
||||||
/packages/demo/apps/app/languages
|
/demo/apps/app/languages
|
||||||
/packages/demo/apps/*/languages
|
/demo/apps/*/languages
|
||||||
/packages/demo/*/node_modules
|
/demo/*/node_modules
|
||||||
/coverage
|
/coverage
|
@ -1,3 +1,4 @@
|
|||||||
|
[](https://gitee.com/zhangfisher/voerka-i18n)
|
||||||
# @voerkai18n/babel
|
# @voerkai18n/babel
|
||||||
|
|
||||||
`Babel`转码插件,用来对翻译文本进行自动转码
|
`Babel`转码插件,用来对翻译文本进行自动转码
|
||||||
|
@ -54,8 +54,7 @@ module.exports =async function compile(langFolder,opts={}){
|
|||||||
const settingsFile = path.join(langFolder,"settings.js")
|
const settingsFile = path.join(langFolder,"settings.js")
|
||||||
try{
|
try{
|
||||||
// 读取多语言配置文件
|
// 读取多语言配置文件
|
||||||
const module =await importModule(`file:///${settingsFile}`)
|
const langSettings = await importModule(settingsFile)
|
||||||
const langSettings = module.default;
|
|
||||||
let { languages,defaultLanguage,activeLanguage,namespaces } = langSettings
|
let { languages,defaultLanguage,activeLanguage,namespaces } = langSettings
|
||||||
|
|
||||||
logger.log(t("支持的语言\t: {}"),languages.map(item=>`${item.title}(${item.name})`).join(","))
|
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")
|
const langSettingsFile = path.join(location,"languages","settings.js")
|
||||||
if(fs.existsSync(langSettingsFile)){
|
if(fs.existsSync(langSettingsFile)){
|
||||||
logger.log(t("语言配置文件<{}>已存在,将优先使用此配置文件中参数来提取文本","./languages/settings.js"))
|
logger.log(t("语言配置文件<{}>已存在,将优先使用此配置文件中参数来提取文本","./languages/settings.js"))
|
||||||
let lngOptions = (await importModule("file:///"+langSettingsFile)).default
|
let lngOptions = await importModule(langSettingsFile)
|
||||||
options.languages = lngOptions.languages
|
options.languages = lngOptions.languages
|
||||||
options.defaultLanguage = lngOptions.defaultLanguage
|
options.defaultLanguage = lngOptions.defaultLanguage
|
||||||
options.activeLanguage = lngOptions.activeLanguage
|
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 path = require("path")
|
||||||
const fs = require("fs")
|
const fs = require("fs")
|
||||||
|
const shelljs = require("shelljs")
|
||||||
const createLogger = require("logsets")
|
const createLogger = require("logsets")
|
||||||
const logger = createLogger()
|
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}={}){
|
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{
|
}else{
|
||||||
fs.writeFileSync(settingsFile,`module.exports = ${JSON.stringify(settings,null,4)}`)
|
fs.writeFileSync(settingsFile,`module.exports = ${JSON.stringify(settings,null,4)}`)
|
||||||
}
|
}
|
||||||
|
// 自动安装运行时@voerkai18n/runtime
|
||||||
|
logger.log(t("正在安装多语言运行时:{}"),"@voerkai18n/runtime")
|
||||||
|
installVoerkai18nRuntim(srcPath)
|
||||||
|
|
||||||
if(debug) {
|
if(debug) {
|
||||||
logger.log(t("生成语言配置文件:{}"),"./languages/settings.js")
|
logger.log(t("生成语言配置文件:{}"),"./languages/settings.js")
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@voerkai18n/cli",
|
"name": "@voerkai18n/cli",
|
||||||
"version": "1.0.1",
|
"version": "1.0.6",
|
||||||
"description": "VoerkaI18n command line interactive tools",
|
"description": "VoerkaI18n command line interactive tools",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"homepage": "https://gitee.com/zhangfisher/voerka-i18n",
|
"homepage": "https://gitee.com/zhangfisher/voerka-i18n",
|
||||||
@ -25,20 +25,21 @@
|
|||||||
"bin": {
|
"bin": {
|
||||||
"voerkai18n": "./index.js",
|
"voerkai18n": "./index.js",
|
||||||
"publish": "npm publish -access public"
|
"publish": "npm publish -access public"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/cli": "^7.17.6",
|
"@babel/cli": "^7.17.6",
|
||||||
"@babel/core": "^7.17.5",
|
"@babel/core": "^7.17.5",
|
||||||
"@voerkai18n/runtime": "workspace:^1.0.0",
|
"@voerkai18n/runtime": "workspace:^1.0.0",
|
||||||
"art-template": "^4.13.2",
|
"art-template": "^4.13.2",
|
||||||
"commander": "^9.0.0",
|
"commander": "^9.0.0",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
"deepmerge": "^4.2.2",
|
"deepmerge": "^4.2.2",
|
||||||
"glob": "^7.2.0",
|
"glob": "^7.2.0",
|
||||||
"gulp": "^4.0.2",
|
"gulp": "^4.0.2",
|
||||||
"logsets": "^1.0.8",
|
"logsets": "^1.0.8",
|
||||||
"readjson": "^2.2.2",
|
"readjson": "^2.2.2",
|
||||||
|
"shelljs": "^0.8.5",
|
||||||
"through2": "^4.0.2",
|
"through2": "^4.0.2",
|
||||||
"vinyl": "^2.2.1",
|
"vinyl": "^2.2.1"
|
||||||
"cross-env": "^7.0.3"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
[](https://gitee.com/zhangfisher/voerka-i18n)
|
||||||
|
|
||||||
# VoerkaI18n命令行工具
|
# VoerkaI18n命令行工具
|
||||||
|
|
||||||
`@VoerkaI18n/cli`实现初始化、文本提取和编译等命令
|
`@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文件,并解析出语言包的类型
|
* 从当前文件夹开始向上查找package.json文件,并解析出语言包的类型
|
||||||
|
*
|
||||||
* @param {*} folder
|
* @param {*} folder
|
||||||
*/
|
*/
|
||||||
function findModuleType(folder){
|
function findModuleType(folder){
|
||||||
try{
|
let packageJson = getCurrentPackageJson(folder)
|
||||||
let pkgPath = path.join(folder, "package.json")
|
try{
|
||||||
if(fs.existsSync(pkgPath)){
|
return packageJson.type || "commonjs"
|
||||||
let pkg = readJson.sync(pkgPath)
|
|
||||||
return pkg.type || "commonjs"
|
|
||||||
}
|
|
||||||
let parent = path.dirname(folder)
|
|
||||||
if(parent===folder) return null
|
|
||||||
return findModuleType(parent)
|
|
||||||
}catch(e){
|
}catch(e){
|
||||||
return "esm"
|
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"){
|
function createPackageJsonFile(targetPath,moduleType="auto"){
|
||||||
if(moduleType==="auto"){
|
if(moduleType==="auto"){
|
||||||
@ -172,6 +186,7 @@ module.exports = {
|
|||||||
createPackageJsonFile,
|
createPackageJsonFile,
|
||||||
isPlainObject,
|
isPlainObject,
|
||||||
getCurrentPackageJson,
|
getCurrentPackageJson,
|
||||||
|
getCurrentProjectRootFolder,
|
||||||
escape,
|
escape,
|
||||||
t
|
t
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
[](https://gitee.com/zhangfisher/voerka-i18n)
|
||||||
|
|
||||||
# @voerkai18n/runtime
|
# @voerkai18n/runtime
|
||||||
|
|
||||||
`voerkai18n`运行时依赖
|
`voerkai18n`运行时依赖
|
3
pnpm-lock.yaml
generated
3
pnpm-lock.yaml
generated
@ -50,6 +50,7 @@ importers:
|
|||||||
gulp: ^4.0.2
|
gulp: ^4.0.2
|
||||||
logsets: ^1.0.8
|
logsets: ^1.0.8
|
||||||
readjson: ^2.2.2
|
readjson: ^2.2.2
|
||||||
|
shelljs: ^0.8.5
|
||||||
through2: ^4.0.2
|
through2: ^4.0.2
|
||||||
vinyl: ^2.2.1
|
vinyl: ^2.2.1
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -64,6 +65,7 @@ importers:
|
|||||||
gulp: 4.0.2
|
gulp: 4.0.2
|
||||||
logsets: 1.0.8
|
logsets: 1.0.8
|
||||||
readjson: 2.2.2
|
readjson: 2.2.2
|
||||||
|
shelljs: 0.8.5
|
||||||
through2: 4.0.2
|
through2: 4.0.2
|
||||||
vinyl: 2.2.1
|
vinyl: 2.2.1
|
||||||
|
|
||||||
@ -5047,7 +5049,6 @@ packages:
|
|||||||
glob: 7.2.0
|
glob: 7.2.0
|
||||||
interpret: 1.4.0
|
interpret: 1.4.0
|
||||||
rechoir: 0.6.2
|
rechoir: 0.6.2
|
||||||
dev: true
|
|
||||||
|
|
||||||
/signal-exit/3.0.7:
|
/signal-exit/3.0.7:
|
||||||
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
- 符合直觉,不需要手动定义文本`Key`映射。
|
- 符合直觉,不需要手动定义文本`Key`映射。
|
||||||
|
|
||||||
- 完整的自动化工具链支持,包括项目初始化、提取文本、编码语言等。
|
- 完整的自动化工具链支持,包括项目初始化、提取文本、编译语言等。
|
||||||
|
|
||||||
- 支持`babel`插件自动导入t翻译函数。
|
- 支持`babel`插件自动导入t翻译函数。
|
||||||
|
|
||||||
@ -1041,14 +1041,20 @@ module.exports = {
|
|||||||
**说明:**
|
**说明:**
|
||||||
|
|
||||||
- 您也可以手动自行创建`languages/settings.js`、`languages/package.json`文件。这样就不需运行`voerkai18n init`命令了。
|
- 您也可以手动自行创建`languages/settings.js`、`languages/package.json`文件。这样就不需运行`voerkai18n init`命令了。
|
||||||
|
|
||||||
- 如果你的源码放在`src`文件夹,则需要在`src`文件夹下执行`init`命令。
|
- 如果你的源码放在`src`文件夹,则需要在`src`文件夹下执行`init`命令。
|
||||||
|
|
||||||
- `voerkai18n init`是可选的,直接使用`extract`时也会自动创建相应的文件。
|
- `voerkai18n init`是可选的,直接使用`extract`时也会自动创建相应的文件。
|
||||||
|
|
||||||
- `-m`参数用来指定生成的`settings.js`的模块类型:
|
- `-m`参数用来指定生成的`settings.js`的模块类型:
|
||||||
- 当`-m=auto`时,会自动读取前工程`package.json`中的`type`字段
|
- 当`-m=auto`时,会自动读取前工程`package.json`中的`type`字段
|
||||||
- 当`-m=esm`时,会生成`ESM`模块类型的`settings.js`。
|
- 当`-m=esm`时,会生成`ESM`模块类型的`settings.js`。
|
||||||
- 当`-m=cjs`时,会生成`commonjs`模块类型的`settings.js`。
|
- 当`-m=cjs`时,会生成`commonjs`模块类型的`settings.js`。
|
||||||
|
|
||||||
- `location`参数是可选的,如果没有指定则采用当前目录。
|
- `location`参数是可选的,如果没有指定则采用当前目录。
|
||||||
|
|
||||||
|
如果你想将`languages`安装在`src/languages`下,则可以指定`voerkai18n init ./src`
|
||||||
|
|
||||||
## extract
|
## extract
|
||||||
|
|
||||||
扫描提取当前项目中的所有源码,提取出所有需要翻译的文本内容并保存在到`<工程源码目录>/languages/translates/*.json`。
|
扫描提取当前项目中的所有源码,提取出所有需要翻译的文本内容并保存在到`<工程源码目录>/languages/translates/*.json`。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user