@ui18n/cli
Version:
🌍 UI18n CLI工具 - 强大的国际化命令行工具
559 lines (442 loc) • 12.3 kB
Markdown
# @ui18n/cli
🛠️ **UI18n命令行工具** - 高效的国际化项目管理工具
[](https://badge.fury.io/js/%40ui18n%2Fcli)
[](https://www.typescriptlang.org/)
[](https://choosealicense.com/licenses/mit/)
## ✨ 特性
- 🚀 **项目初始化**:快速创建国际化项目结构
- 📝 **文本提取**:自动扫描代码,提取需要翻译的文本
- 🌍 **批量翻译**:高效的批量翻译处理
- 📊 **统计分析**:详细的翻译进度和成本分析
- 🔧 **配置管理**:灵活的项目配置管理
- 🎯 **多框架支持**:支持React、Vue、Angular等主流框架
- 💰 **成本优化**:智能缓存,最小化AI API调用
## 🚀 安装
```bash
# 全局安装
npm install -g @ui18n/cli
# 或项目内安装
npm install --save-dev @ui18n/cli
```
## 📋 命令概览
```bash
ui18n --help
Commands:
ui18n init [name] 初始化新的国际化项目
ui18n extract 提取需要翻译的文本
ui18n translate 批量翻译文本
ui18n stats 查看翻译统计信息
ui18n config 管理项目配置
Options:
--version 显示版本号
--help 显示帮助信息
```
## 🎯 快速开始
### 1. 初始化项目
```bash
# 在当前目录初始化
ui18n init
# 创建新项目
ui18n init my-i18n-project
# 指定框架
ui18n init --framework react
ui18n init --framework vue
```
初始化后会创建以下结构:
```
my-project/
├── ui18n.config.js # 配置文件
├── i18n/
│ ├── texts.json # 提取的文本
│ ├── translations/ # 翻译结果
│ └── cache/ # 翻译缓存
└── src/ # 你的源代码
```
### 2. 配置项目
编辑 `ui18n.config.js`:
```javascript
module.exports = {
// 基础配置
defaultLanguage: 'zh-CN',
targetLanguages: ['en', 'ja', 'ko'],
// 自托管模式(推荐)
aiProvider: {
type: 'openai',
apiKey: process.env.OPENAI_API_KEY,
model: 'gpt-3.5-turbo'
},
// 或使用云端服务(可选)
// serviceMode: 'cloud',
// userKey: 'your-user-key',
// 文件扫描配置
scan: {
include: ['src/**/*.{js,jsx,ts,tsx,vue}'],
exclude: ['node_modules/**', 'dist/**'],
patterns: [
/t\(['"`](.+?)['"`]\)/g, // t('文本')
/\$t\(['"`](.+?)['"`]\)/g, // $t('文本')
/<T[^>]*text=['"`](.+?)['"`]/g // <T text="文本" />
]
},
// 输出配置
output: {
format: 'json', // 'json' | 'yaml' | 'po'
directory: './i18n/translations',
filename: '[lang].json'
}
};
```
### 3. 提取文本
```bash
# 扫描代码,提取需要翻译的文本
ui18n extract
# 指定扫描目录
ui18n extract --input src/
# 指定输出文件
ui18n extract --output ./i18n/texts.json
# 增量提取(只提取新文本)
ui18n extract --incremental
```
### 4. 批量翻译
```bash
# 翻译到所有目标语言
ui18n translate
# 翻译到特定语言
ui18n translate --languages en,ja
# 指定输入文件
ui18n translate --input ./i18n/texts.json
# 并发控制
ui18n translate --concurrency 3
# 预览模式(不实际翻译)
ui18n translate --dry-run
```
### 5. 查看统计
```bash
# 查看项目统计
ui18n stats
# 详细统计
ui18n stats --detailed
# 成本分析
ui18n stats --cost
```
## 📝 详细命令
### `ui18n init`
初始化新的国际化项目。
```bash
ui18n init [项目名称] [选项]
选项:
--framework <type> 指定框架 (react|vue|angular|vanilla)
--template <name> 使用模板 (basic|advanced|enterprise)
--ai-provider <type> AI提供商 (openai|claude|qwen)
--languages <langs> 目标语言列表,逗号分隔
--force 强制覆盖已存在的文件
```
示例:
```bash
ui18n init my-app --framework react --languages en,ja,ko
```
### `ui18n extract`
从代码中提取需要翻译的文本。
```bash
ui18n extract [选项]
选项:
--input <dir> 扫描目录 (默认: src/)
--output <file> 输出文件 (默认: i18n/texts.json)
--patterns <file> 自定义提取规则文件
--incremental 增量提取模式
--format <type> 输出格式 (json|yaml|csv)
--exclude <patterns> 排除文件模式
--min-length <num> 最小文本长度
--max-length <num> 最大文本长度
```
示例:
```bash
ui18n extract --input src/ --output i18n/texts.json --incremental
```
### `ui18n translate`
批量翻译文本。
```bash
ui18n translate [选项]
选项:
--input <file> 输入文件 (默认: i18n/texts.json)
--output <dir> 输出目录 (默认: i18n/translations/)
--languages <langs> 目标语言,逗号分隔
--concurrency <num> 并发数 (默认: 3)
--batch-size <num> 批处理大小 (默认: 10)
--dry-run 预览模式,不实际翻译
--force 强制重新翻译已有内容
--cache-only 仅使用缓存,不调用AI
```
示例:
```bash
ui18n translate --languages en,ja --concurrency 5 --batch-size 20
```
### `ui18n stats`
查看项目统计信息。
```bash
ui18n stats [选项]
选项:
--detailed 显示详细统计
--cost 显示成本分析
--format <type> 输出格式 (table|json|csv)
--export <file> 导出统计到文件
--languages <langs> 指定语言范围
```
示例:
```bash
ui18n stats --detailed --cost --export stats.json
```
### `ui18n config`
管理项目配置。
```bash
ui18n config <action> [选项]
Actions:
get <key> 获取配置值
set <key> <value> 设置配置值
list 列出所有配置
reset 重置为默认配置
validate 验证配置文件
选项:
--global 操作全局配置
--config <file> 指定配置文件
```
示例:
```bash
ui18n config set aiProvider.apiKey sk-xxx
ui18n config get targetLanguages
ui18n config list --global
```
## 🔧 配置文件详解
### 完整配置示例
```javascript
// ui18n.config.js
module.exports = {
// 基础设置
defaultLanguage: 'zh-CN',
targetLanguages: ['en', 'ja', 'ko', 'es', 'fr'],
fallbackLanguage: 'en',
// AI提供商配置(自托管模式)
aiProvider: {
type: 'openai',
apiKey: process.env.OPENAI_API_KEY,
baseURL: 'https://api.openai.com/v1',
model: 'gpt-3.5-turbo',
timeout: 30000,
retries: 3,
// 自定义提示词
systemPrompt: '你是一个专业的UI文本翻译专家...',
// 请求配置
requestConfig: {
temperature: 0.1,
max_tokens: 1000
}
},
// 云端服务配置(可选)
// serviceMode: 'cloud',
// userKey: 'your-user-key',
// 文件扫描配置
scan: {
include: [
'src/**/*.{js,jsx,ts,tsx}',
'src/**/*.vue',
'pages/**/*.{js,ts,jsx,tsx}'
],
exclude: [
'node_modules/**',
'dist/**',
'build/**',
'**/*.test.{js,ts}',
'**/*.spec.{js,ts}'
],
// 文本提取规则
patterns: [
// 函数调用模式
{
pattern: /t\(['"`](.+?)['"`]\)/g,
description: 't() 函数调用'
},
{
pattern: /\$t\(['"`](.+?)['"`]\)/g,
description: 'Vue $t() 调用'
},
// JSX/组件模式
{
pattern: /<T[^>]*text=['"`](.+?)['"`]/g,
description: 'T 组件 text 属性'
},
{
pattern: /<Trans[^>]*i18nKey=['"`](.+?)['"`]/g,
description: 'react-i18next Trans 组件'
},
// 自定义模式
{
pattern: /translate\(['"`](.+?)['"`]\)/g,
description: '自定义 translate 函数'
}
],
// 过滤规则
filters: {
minLength: 2,
maxLength: 200,
excludePatterns: [
/^[0-9]+$/, // 纯数字
/^[a-zA-Z0-9_-]+$/, // 变量名格式
/^\s*$/ // 空白字符
]
}
},
// 翻译配置
translation: {
batchSize: 10,
maxConcurrency: 3,
retryAttempts: 3,
retryDelay: 1000,
// 质量控制
qualityCheck: {
enabled: true,
maxLengthRatio: 3.0, // 译文长度不超过原文3倍
minSimilarity: 0.3 // 最小相似度
}
},
// 缓存配置
cache: {
enabled: true,
directory: './i18n/cache',
ttl: 7 * 24 * 60 * 60 * 1000, // 7天
compression: true
},
// 输出配置
output: {
format: 'json',
directory: './i18n/translations',
filename: '[lang].json',
indent: 2,
sortKeys: true,
// 多格式输出
formats: {
json: {
filename: '[lang].json',
indent: 2
},
yaml: {
filename: '[lang].yml'
},
po: {
filename: '[lang].po',
metadata: {
'Project-Id-Version': 'MyApp 1.0',
'Language': '[lang]'
}
}
}
},
// 钩子函数
hooks: {
beforeExtract: async (config) => {
console.log('开始提取文本...');
},
afterExtract: async (texts, config) => {
console.log(`提取了 ${texts.length} 个文本`);
},
beforeTranslate: async (texts, targetLang, config) => {
console.log(`开始翻译到 ${targetLang}...`);
},
afterTranslate: async (results, targetLang, config) => {
console.log(`翻译完成: ${Object.keys(results).length} 个文本`);
}
}
};
```
## 🎯 使用场景
### 1. 新项目快速启动
```bash
# 创建React项目的国际化配置
ui18n init my-react-app --framework react --languages en,ja,ko
# 提取现有代码中的文本
ui18n extract --input src/
# 批量翻译
ui18n translate --languages en,ja,ko
```
### 2. 持续集成/部署
```bash
#!/bin/bash
# CI/CD 脚本示例
# 提取新文本
ui18n extract --incremental
# 检查是否有新文本需要翻译
if [ -s i18n/texts.json ]; then
echo "发现新文本,开始翻译..."
ui18n translate --cache-only || ui18n translate
fi
# 验证翻译完整性
ui18n stats --format json > translation-stats.json
```
### 3. 成本控制
```bash
# 预览翻译成本
ui18n translate --dry-run --detailed
# 仅使用缓存翻译
ui18n translate --cache-only
# 查看成本分析
ui18n stats --cost
```
### 4. 团队协作
```bash
# 导出待翻译文本给翻译团队
ui18n extract --format csv --output texts-for-translation.csv
# 导入翻译结果
ui18n import --input translations.csv --format csv
# 生成翻译报告
ui18n stats --detailed --export team-report.json
```
## 🔌 插件系统
CLI支持插件扩展功能:
```javascript
// ui18n.config.js
module.exports = {
plugins: [
// 自定义提取器插件
{
name: 'custom-extractor',
extract: async (files) => {
// 自定义提取逻辑
}
},
// 翻译后处理插件
{
name: 'post-processor',
afterTranslate: async (results) => {
// 翻译后处理逻辑
}
}
]
};
```
## 📊 输出格式
### JSON格式
```json
{
"保存": "Save",
"取消": "Cancel",
"确定": "OK"
}
```
### YAML格式
```yaml
保存: Save
取消: Cancel
确定: OK
```
### PO格式
```po
msgid "保存"
msgstr "Save"
msgid "取消"
msgstr "Cancel"
```
## 🤝 贡献
欢迎贡献代码!请查看 [贡献指南](../../CONTRIBUTING.md)。
## 📄 许可证
MIT License - 详见 [LICENSE](../../LICENSE) 文件。
---
**让国际化管理变得简单高效!** 🛠️✨