@llm-translate/cli 1.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +51 -0
- package/.env.example +33 -0
- package/.github/workflows/docs-pages.yml +57 -0
- package/.github/workflows/release.yml +49 -0
- package/.translaterc.json +44 -0
- package/CLAUDE.md +243 -0
- package/Dockerfile +55 -0
- package/README.md +371 -0
- package/RFC.md +1595 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +4494 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +1152 -0
- package/dist/index.js +3841 -0
- package/dist/index.js.map +1 -0
- package/docker-compose.yml +56 -0
- package/docs/.vitepress/config.ts +161 -0
- package/docs/api/agent.md +262 -0
- package/docs/api/engine.md +274 -0
- package/docs/api/index.md +171 -0
- package/docs/api/providers.md +304 -0
- package/docs/changelog.md +64 -0
- package/docs/cli/dir.md +243 -0
- package/docs/cli/file.md +213 -0
- package/docs/cli/glossary.md +273 -0
- package/docs/cli/index.md +129 -0
- package/docs/cli/init.md +158 -0
- package/docs/cli/serve.md +211 -0
- package/docs/glossary.json +235 -0
- package/docs/guide/chunking.md +272 -0
- package/docs/guide/configuration.md +139 -0
- package/docs/guide/cost-optimization.md +237 -0
- package/docs/guide/docker.md +371 -0
- package/docs/guide/getting-started.md +150 -0
- package/docs/guide/glossary.md +241 -0
- package/docs/guide/index.md +86 -0
- package/docs/guide/ollama.md +515 -0
- package/docs/guide/prompt-caching.md +221 -0
- package/docs/guide/providers.md +232 -0
- package/docs/guide/quality-control.md +206 -0
- package/docs/guide/vitepress-integration.md +265 -0
- package/docs/index.md +63 -0
- package/docs/ja/api/agent.md +262 -0
- package/docs/ja/api/engine.md +274 -0
- package/docs/ja/api/index.md +171 -0
- package/docs/ja/api/providers.md +304 -0
- package/docs/ja/changelog.md +64 -0
- package/docs/ja/cli/dir.md +243 -0
- package/docs/ja/cli/file.md +213 -0
- package/docs/ja/cli/glossary.md +273 -0
- package/docs/ja/cli/index.md +111 -0
- package/docs/ja/cli/init.md +158 -0
- package/docs/ja/guide/chunking.md +271 -0
- package/docs/ja/guide/configuration.md +139 -0
- package/docs/ja/guide/cost-optimization.md +30 -0
- package/docs/ja/guide/getting-started.md +150 -0
- package/docs/ja/guide/glossary.md +214 -0
- package/docs/ja/guide/index.md +32 -0
- package/docs/ja/guide/ollama.md +410 -0
- package/docs/ja/guide/prompt-caching.md +221 -0
- package/docs/ja/guide/providers.md +232 -0
- package/docs/ja/guide/quality-control.md +137 -0
- package/docs/ja/guide/vitepress-integration.md +265 -0
- package/docs/ja/index.md +58 -0
- package/docs/ko/api/agent.md +262 -0
- package/docs/ko/api/engine.md +274 -0
- package/docs/ko/api/index.md +171 -0
- package/docs/ko/api/providers.md +304 -0
- package/docs/ko/changelog.md +64 -0
- package/docs/ko/cli/dir.md +243 -0
- package/docs/ko/cli/file.md +213 -0
- package/docs/ko/cli/glossary.md +273 -0
- package/docs/ko/cli/index.md +111 -0
- package/docs/ko/cli/init.md +158 -0
- package/docs/ko/guide/chunking.md +271 -0
- package/docs/ko/guide/configuration.md +139 -0
- package/docs/ko/guide/cost-optimization.md +30 -0
- package/docs/ko/guide/getting-started.md +150 -0
- package/docs/ko/guide/glossary.md +214 -0
- package/docs/ko/guide/index.md +32 -0
- package/docs/ko/guide/ollama.md +410 -0
- package/docs/ko/guide/prompt-caching.md +221 -0
- package/docs/ko/guide/providers.md +232 -0
- package/docs/ko/guide/quality-control.md +137 -0
- package/docs/ko/guide/vitepress-integration.md +265 -0
- package/docs/ko/index.md +58 -0
- package/docs/zh/api/agent.md +262 -0
- package/docs/zh/api/engine.md +274 -0
- package/docs/zh/api/index.md +171 -0
- package/docs/zh/api/providers.md +304 -0
- package/docs/zh/changelog.md +64 -0
- package/docs/zh/cli/dir.md +243 -0
- package/docs/zh/cli/file.md +213 -0
- package/docs/zh/cli/glossary.md +273 -0
- package/docs/zh/cli/index.md +111 -0
- package/docs/zh/cli/init.md +158 -0
- package/docs/zh/guide/chunking.md +271 -0
- package/docs/zh/guide/configuration.md +139 -0
- package/docs/zh/guide/cost-optimization.md +30 -0
- package/docs/zh/guide/getting-started.md +150 -0
- package/docs/zh/guide/glossary.md +214 -0
- package/docs/zh/guide/index.md +32 -0
- package/docs/zh/guide/ollama.md +410 -0
- package/docs/zh/guide/prompt-caching.md +221 -0
- package/docs/zh/guide/providers.md +232 -0
- package/docs/zh/guide/quality-control.md +137 -0
- package/docs/zh/guide/vitepress-integration.md +265 -0
- package/docs/zh/index.md +58 -0
- package/package.json +91 -0
- package/release.config.mjs +15 -0
- package/schemas/glossary.schema.json +110 -0
- package/src/cli/commands/dir.ts +469 -0
- package/src/cli/commands/file.ts +291 -0
- package/src/cli/commands/glossary.ts +221 -0
- package/src/cli/commands/init.ts +68 -0
- package/src/cli/commands/serve.ts +60 -0
- package/src/cli/index.ts +64 -0
- package/src/cli/options.ts +59 -0
- package/src/core/agent.ts +1119 -0
- package/src/core/chunker.ts +391 -0
- package/src/core/engine.ts +634 -0
- package/src/errors.ts +188 -0
- package/src/index.ts +147 -0
- package/src/integrations/vitepress.ts +549 -0
- package/src/parsers/markdown.ts +383 -0
- package/src/providers/claude.ts +259 -0
- package/src/providers/interface.ts +109 -0
- package/src/providers/ollama.ts +379 -0
- package/src/providers/openai.ts +308 -0
- package/src/providers/registry.ts +153 -0
- package/src/server/index.ts +152 -0
- package/src/server/middleware/auth.ts +93 -0
- package/src/server/middleware/logger.ts +90 -0
- package/src/server/routes/health.ts +84 -0
- package/src/server/routes/translate.ts +210 -0
- package/src/server/types.ts +138 -0
- package/src/services/cache.ts +899 -0
- package/src/services/config.ts +217 -0
- package/src/services/glossary.ts +247 -0
- package/src/types/analysis.ts +164 -0
- package/src/types/index.ts +265 -0
- package/src/types/modes.ts +121 -0
- package/src/types/mqm.ts +157 -0
- package/src/utils/logger.ts +141 -0
- package/src/utils/tokens.ts +116 -0
- package/tests/fixtures/glossaries/ml-glossary.json +53 -0
- package/tests/fixtures/input/lynq-installation.ko.md +350 -0
- package/tests/fixtures/input/lynq-installation.md +350 -0
- package/tests/fixtures/input/simple.ko.md +27 -0
- package/tests/fixtures/input/simple.md +27 -0
- package/tests/unit/chunker.test.ts +229 -0
- package/tests/unit/glossary.test.ts +146 -0
- package/tests/unit/markdown.test.ts +205 -0
- package/tests/unit/tokens.test.ts +81 -0
- package/tsconfig.json +28 -0
- package/tsup.config.ts +34 -0
- package/vitest.config.ts +16 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# 提供商
|
|
2
|
+
|
|
3
|
+
::: info 翻译说明
|
|
4
|
+
所有非英文文档均使用 Claude Sonnet 4 自动翻译。
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translate 支持多个 LLM 提供商。每个提供商都有不同的优势和权衡。
|
|
8
|
+
|
|
9
|
+
## 支持的提供商
|
|
10
|
+
|
|
11
|
+
| 提供商 | 缓存 | 最适用于 | 设置复杂度 |
|
|
12
|
+
|----------|---------|----------|------------------|
|
|
13
|
+
| Claude | 完整 | 质量 + 成本 | 简单 |
|
|
14
|
+
| OpenAI | 自动 | 生态系统 | 简单 |
|
|
15
|
+
| Ollama | 无 | 隐私/离线 | 中等 |
|
|
16
|
+
|
|
17
|
+
## Claude(推荐)
|
|
18
|
+
|
|
19
|
+
### 为什么选择 Claude?
|
|
20
|
+
|
|
21
|
+
- **提示缓存**:成本降低高达 90%
|
|
22
|
+
- **高质量**:出色的翻译准确性
|
|
23
|
+
- **长上下文**:200K 令牌上下文窗口
|
|
24
|
+
- **多层级**:Haiku(快速)、Sonnet(平衡)、Opus(最佳)
|
|
25
|
+
|
|
26
|
+
### 设置
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
export ANTHROPIC_API_KEY=sk-ant-xxxxx
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 模型选择
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Fast and cheap (default)
|
|
36
|
+
llm-translate file doc.md --target ko --model claude-haiku-4-5-20251001
|
|
37
|
+
|
|
38
|
+
# Balanced quality/cost
|
|
39
|
+
llm-translate file doc.md --target ko --model claude-sonnet-4-5-20250929
|
|
40
|
+
|
|
41
|
+
# Highest quality
|
|
42
|
+
llm-translate file doc.md --target ko --model claude-opus-4-5-20251101
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 何时使用各个模型
|
|
46
|
+
|
|
47
|
+
| 模型 | 使用场景 |
|
|
48
|
+
|-------|----------|
|
|
49
|
+
| Haiku | README 文件、简单文档、大批量 |
|
|
50
|
+
| Sonnet | 技术文档、API 参考 |
|
|
51
|
+
| Opus | 法律、营销、细致入微的内容 |
|
|
52
|
+
|
|
53
|
+
## OpenAI
|
|
54
|
+
|
|
55
|
+
### 设置
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
export OPENAI_API_KEY=sk-xxxxx
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 使用
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
llm-translate file doc.md --target ko --provider openai --model gpt-4o
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 可用模型
|
|
68
|
+
|
|
69
|
+
| 模型 | 速度 | 质量 | 成本 |
|
|
70
|
+
|-------|-------|---------|------|
|
|
71
|
+
| gpt-4o-mini | 快 | 良好 | 很低 |
|
|
72
|
+
| gpt-4o | 中等 | 优秀 | 中等 |
|
|
73
|
+
| gpt-4-turbo | 中等 | 优秀 | 高 |
|
|
74
|
+
|
|
75
|
+
### 何时使用
|
|
76
|
+
|
|
77
|
+
- 已经在其他服务中使用 OpenAI
|
|
78
|
+
- 需要特定的 OpenAI 功能
|
|
79
|
+
- 偏好 Azure OpenAI(设置自定义 baseUrl)
|
|
80
|
+
|
|
81
|
+
## Ollama
|
|
82
|
+
|
|
83
|
+
用于隐私或离线使用的本地自托管 LLM。无需 API 密钥。
|
|
84
|
+
|
|
85
|
+
::: warning 质量因模型而异
|
|
86
|
+
Ollama 翻译质量**高度依赖于模型选择**。为获得可靠的翻译结果:
|
|
87
|
+
|
|
88
|
+
- **最低要求**:14B+ 参数模型(例如 `qwen2.5:14b` 、 `llama3.1:14b`)
|
|
89
|
+
- **推荐**:32B+ 模型(例如 `qwen2.5:32b` 、 `llama3.3:70b`)
|
|
90
|
+
- **不推荐**:7B 以下的模型会产生不一致且通常无法使用的翻译
|
|
91
|
+
|
|
92
|
+
较小的模型(3B、7B)可能适用于简单内容,但在技术文档上经常失败,产生不完整的输出,或忽略格式指令。
|
|
93
|
+
:::
|
|
94
|
+
|
|
95
|
+
### 快速设置
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
# 1. Install (macOS)
|
|
99
|
+
brew install ollama
|
|
100
|
+
|
|
101
|
+
# 2. Pull qwen2.5:14b (recommended)
|
|
102
|
+
ollama pull qwen2.5:14b
|
|
103
|
+
|
|
104
|
+
# 3. Translate
|
|
105
|
+
llm-translate file doc.md -s en -t ko --provider ollama --model qwen2.5:14b
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 推荐模型
|
|
109
|
+
|
|
110
|
+
| 模型 | 内存 | 质量 | 最适用于 |
|
|
111
|
+
|-------|-----|---------|----------|
|
|
112
|
+
|`qwen2.5:14b`| 16GB | 很好 | **最佳平衡(推荐)** |
|
|
113
|
+
|`qwen2.5:32b`| 32GB | 优秀 | 更高质量 |
|
|
114
|
+
|`llama3.1:8b`| 8GB | 良好 | 轻量级 |
|
|
115
|
+
|`llama3.2`| 4GB | 一般 | 仅限简单内容 |
|
|
116
|
+
|
|
117
|
+
### 何时使用
|
|
118
|
+
|
|
119
|
+
- 敏感/私密文档
|
|
120
|
+
- 离线环境
|
|
121
|
+
- 成本优化(无 API 费用)
|
|
122
|
+
- 简单到中等复杂度的内容
|
|
123
|
+
|
|
124
|
+
::: tip 完整指南
|
|
125
|
+
查看[使用 Ollama 进行本地翻译](./ollama)获取完整的设置说明、GPU 优化、故障排除和高级配置。
|
|
126
|
+
:::
|
|
127
|
+
|
|
128
|
+
## 提供商比较
|
|
129
|
+
|
|
130
|
+
### 质量
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
Opus > Sonnet ≈ GPT-4o > Haiku ≈ GPT-4o-mini > Qwen2.5:32b > Qwen2.5:14b
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 成本(每 100 万令牌)
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Ollama ($0) < GPT-4o-mini ($0.15) < Haiku ($1) < GPT-4o ($2.5) < Sonnet ($3) < Opus ($15)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 速度
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
Haiku ≈ GPT-4o-mini > Sonnet ≈ GPT-4o > Opus > Ollama (varies with hardware)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 切换提供商
|
|
149
|
+
|
|
150
|
+
### CLI
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Different providers
|
|
154
|
+
llm-translate file doc.md -s en -t ko --provider claude
|
|
155
|
+
llm-translate file doc.md -s en -t ko --provider openai
|
|
156
|
+
llm-translate file doc.md -s en -t ko --provider ollama
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 配置文件
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"provider": {
|
|
164
|
+
"name": "openai",
|
|
165
|
+
"model": "gpt-4o"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 编程方式
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
import {
|
|
174
|
+
createClaudeProvider,
|
|
175
|
+
createOpenAIProvider,
|
|
176
|
+
createOllamaProvider,
|
|
177
|
+
TranslationEngine,
|
|
178
|
+
} from '@llm-translate/cli';
|
|
179
|
+
|
|
180
|
+
// Switch providers easily
|
|
181
|
+
const providers = {
|
|
182
|
+
claude: createClaudeProvider(),
|
|
183
|
+
openai: createOpenAIProvider(),
|
|
184
|
+
ollama: createOllamaProvider(),
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const engine = new TranslationEngine({
|
|
188
|
+
provider: providers[selectedProvider],
|
|
189
|
+
});
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## 回退配置
|
|
193
|
+
|
|
194
|
+
配置回退提供商以提高可靠性:
|
|
195
|
+
|
|
196
|
+
```json
|
|
197
|
+
{
|
|
198
|
+
"provider": {
|
|
199
|
+
"name": "claude",
|
|
200
|
+
"model": "claude-haiku-4-5-20251001",
|
|
201
|
+
"fallback": [
|
|
202
|
+
{ "name": "openai", "model": "gpt-4o-mini" },
|
|
203
|
+
{ "name": "ollama", "model": "llama3.1" }
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 自定义端点
|
|
210
|
+
|
|
211
|
+
### Azure OpenAI
|
|
212
|
+
|
|
213
|
+
```json
|
|
214
|
+
{
|
|
215
|
+
"provider": {
|
|
216
|
+
"name": "openai",
|
|
217
|
+
"baseUrl": "https://your-resource.openai.azure.com",
|
|
218
|
+
"apiKey": "your-azure-key"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 自托管
|
|
224
|
+
|
|
225
|
+
```json
|
|
226
|
+
{
|
|
227
|
+
"provider": {
|
|
228
|
+
"name": "ollama",
|
|
229
|
+
"baseUrl": "https://your-server.com:11434"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# 质量控制
|
|
2
|
+
|
|
3
|
+
::: info 翻译说明
|
|
4
|
+
所有非英文文档均使用 Claude Sonnet 4 自动翻译。
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translate 使用 Self-Refine 算法来确保翻译质量满足您的要求。
|
|
8
|
+
|
|
9
|
+
## Self-Refine 工作原理
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────┐
|
|
13
|
+
│ Initial Translate│
|
|
14
|
+
└────────┬────────┘
|
|
15
|
+
▼
|
|
16
|
+
┌─────────────────┐
|
|
17
|
+
│ Evaluate Quality │◀──────────────┐
|
|
18
|
+
└────────┬────────┘ │
|
|
19
|
+
▼ │
|
|
20
|
+
Score >= Threshold? │
|
|
21
|
+
│ │
|
|
22
|
+
No │ Yes │
|
|
23
|
+
│ │ │
|
|
24
|
+
▼ ▼ │
|
|
25
|
+
┌─────────┐ ┌──────┐ │
|
|
26
|
+
│ Reflect │ │ Done │ │
|
|
27
|
+
└────┬────┘ └──────┘ │
|
|
28
|
+
▼ │
|
|
29
|
+
┌─────────────────┐ │
|
|
30
|
+
│ Improve │───────────────┘
|
|
31
|
+
└─────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 1. 初始翻译
|
|
35
|
+
|
|
36
|
+
第一次翻译生成时包含:
|
|
37
|
+
- 完整术语表上下文
|
|
38
|
+
- 文档结构信息
|
|
39
|
+
- 前一个 chunk 的上下文(保持连续性)
|
|
40
|
+
|
|
41
|
+
### 2. 质量评估
|
|
42
|
+
|
|
43
|
+
每个翻译都会根据四个标准进行评分:
|
|
44
|
+
|
|
45
|
+
| 标准 | 权重 | 描述 |
|
|
46
|
+
|-----------|--------|-------------|
|
|
47
|
+
| 语义准确性 | 40% | 是否传达了正确的含义? |
|
|
48
|
+
| 流畅度 | 25% | 在目标语言中读起来是否自然? |
|
|
49
|
+
| 术语表合规性 | 20% | 是否正确应用了所有术语表条目? |
|
|
50
|
+
| 格式保持 | 15% | 是否保持了 Markdown/HTML 结构? |
|
|
51
|
+
|
|
52
|
+
### 3. 反思
|
|
53
|
+
|
|
54
|
+
如果质量低于阈值,LLM 会分析:
|
|
55
|
+
- 存在哪些具体问题
|
|
56
|
+
- 遗漏了哪些术语表条目
|
|
57
|
+
- 哪里可以改善流畅度
|
|
58
|
+
|
|
59
|
+
### 4. 改进
|
|
60
|
+
|
|
61
|
+
基于反思反馈应用针对性修复,然后重复循环。
|
|
62
|
+
|
|
63
|
+
## 配置
|
|
64
|
+
|
|
65
|
+
### 质量阈值
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# CLI
|
|
69
|
+
llm-translate file doc.md -o doc.ko.md -s en -t ko --quality 90
|
|
70
|
+
|
|
71
|
+
# Config file
|
|
72
|
+
{
|
|
73
|
+
"translation": {
|
|
74
|
+
"qualityThreshold": 90
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 最大迭代次数
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# CLI
|
|
83
|
+
llm-translate file doc.md -o doc.ko.md -s en -t ko --max-iterations 6
|
|
84
|
+
|
|
85
|
+
# Config file
|
|
86
|
+
{
|
|
87
|
+
"translation": {
|
|
88
|
+
"maxIterations": 6
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 严格模式
|
|
94
|
+
|
|
95
|
+
如果未达到质量阈值则失败:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
llm-translate file doc.md -o doc.ko.md -s en -t ko --strict-quality
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
退出代码:
|
|
102
|
+
-`0`- 成功
|
|
103
|
+
-`4`- 未达到质量阈值(严格模式)
|
|
104
|
+
|
|
105
|
+
## 质量分数解释
|
|
106
|
+
|
|
107
|
+
| 分数 | 质量等级 | 描述 |
|
|
108
|
+
|-------|--------------|-------------|
|
|
109
|
+
| 95-100 | 优秀 | 可直接发布 |
|
|
110
|
+
| 85-94 | 良好 | 有轻微问题,大多数用途可接受 |
|
|
111
|
+
| 75-84 | 一般 | 有明显问题,可能需要审查 |
|
|
112
|
+
| 60-74 | 较差 | 有重大问题,需要人工审查 |
|
|
113
|
+
| < 60 | 不可接受 | 有严重问题,考虑重新翻译 |
|
|
114
|
+
|
|
115
|
+
## 理解输出
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
✓ Translation complete
|
|
119
|
+
Quality: 92/85 (threshold met)
|
|
120
|
+
Breakdown:
|
|
121
|
+
- Accuracy: 38/40
|
|
122
|
+
- Fluency: 24/25
|
|
123
|
+
- Glossary: 18/20
|
|
124
|
+
- Format: 12/15
|
|
125
|
+
Iterations: 2
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 详细分析
|
|
129
|
+
|
|
130
|
+
- **准确性 (38/40)**:翻译在语义上正确
|
|
131
|
+
- **流畅度 (24/25)**:在目标语言中读起来自然
|
|
132
|
+
- **术语表 (18/20)**:大部分条目已应用,有些变化
|
|
133
|
+
- **格式 (12/15)**:需要轻微的格式调整
|
|
134
|
+
|
|
135
|
+
## 质量调优
|
|
136
|
+
|
|
137
|
+
### 提高质量
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# VitePress 集成
|
|
2
|
+
|
|
3
|
+
::: info 翻译说明
|
|
4
|
+
所有非英文文档均使用 Claude Sonnet 4 自动翻译。
|
|
5
|
+
:::
|
|
6
|
+
|
|
7
|
+
llm-translate 提供辅助函数,可根据您翻译的文档结构自动生成 VitePress i18n 配置。
|
|
8
|
+
|
|
9
|
+
## 概述
|
|
10
|
+
|
|
11
|
+
使用 `llm-translate dir` 翻译文档后,您可以使用内置的 VitePress 辅助工具为每个语言环境自动生成导航和侧边栏配置。
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @llm-translate/cli
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 基本用法
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// docs/.vitepress/config.ts
|
|
23
|
+
import { defineConfig } from 'vitepress';
|
|
24
|
+
import { fileURLToPath } from 'node:url';
|
|
25
|
+
import { dirname, resolve } from 'node:path';
|
|
26
|
+
import { generateLocaleConfig } from '@llm-translate/cli';
|
|
27
|
+
|
|
28
|
+
// Get docs directory path relative to this config file
|
|
29
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const docsDir = resolve(__dirname, '..');
|
|
31
|
+
|
|
32
|
+
const locales = generateLocaleConfig(docsDir, {
|
|
33
|
+
defaultLocale: 'en',
|
|
34
|
+
locales: ['ko', 'ja'],
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export default defineConfig({
|
|
38
|
+
title: 'My Project',
|
|
39
|
+
locales,
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
::: tip 为什么使用绝对路径?
|
|
44
|
+
VitePress 配置从项目根目录运行,因此像 `'./docs'` 这样的相对路径可能无法正确解析。使用 `import.meta.url` 确保路径相对于配置文件位置计算。
|
|
45
|
+
:::
|
|
46
|
+
|
|
47
|
+
这将:
|
|
48
|
+
1. 扫描您的 `./docs` 目录结构
|
|
49
|
+
2. 自动检测侧边栏目录(guide、api、cli 等)
|
|
50
|
+
3. 为每个语言环境生成导航和侧边栏
|
|
51
|
+
4. 为 UI 元素应用默认翻译
|
|
52
|
+
|
|
53
|
+
## 配置选项
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
interface GenerateOptions {
|
|
57
|
+
/** Default locale code (e.g., 'en') - defaults to 'en' */
|
|
58
|
+
defaultLocale?: string;
|
|
59
|
+
|
|
60
|
+
/** List of locale codes to generate (auto-detected if omitted) */
|
|
61
|
+
locales?: string[];
|
|
62
|
+
|
|
63
|
+
/** Locale display labels */
|
|
64
|
+
labels?: Record<string, string>;
|
|
65
|
+
|
|
66
|
+
/** Locale lang codes for HTML */
|
|
67
|
+
langCodes?: Record<string, string>;
|
|
68
|
+
|
|
69
|
+
/** Locale descriptions */
|
|
70
|
+
descriptions?: Record<string, string>;
|
|
71
|
+
|
|
72
|
+
/** Directories to include in sidebar (auto-detected if omitted) */
|
|
73
|
+
sidebarDirs?: string[];
|
|
74
|
+
|
|
75
|
+
/** Use title from file's first heading (default: true) */
|
|
76
|
+
useTitleFromHeading?: boolean;
|
|
77
|
+
|
|
78
|
+
/** Custom locale translations */
|
|
79
|
+
translations?: Record<string, LocaleTranslations>;
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 示例
|
|
84
|
+
|
|
85
|
+
### 自动检测语言环境
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { generateLocaleConfig, detectLocales } from '@llm-translate/cli';
|
|
89
|
+
|
|
90
|
+
// Automatically detect locales from directory structure
|
|
91
|
+
// (looks for 2-letter directories like 'ko', 'ja', 'zh')
|
|
92
|
+
const locales = generateLocaleConfig('./docs');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 自定义标签和描述
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
const locales = generateLocaleConfig('./docs', {
|
|
99
|
+
defaultLocale: 'en',
|
|
100
|
+
locales: ['ko', 'ja'],
|
|
101
|
+
labels: {
|
|
102
|
+
en: 'English',
|
|
103
|
+
ko: '한국어',
|
|
104
|
+
ja: '日本語',
|
|
105
|
+
},
|
|
106
|
+
descriptions: {
|
|
107
|
+
en: 'Documentation for My Project',
|
|
108
|
+
ko: 'My Project 문서',
|
|
109
|
+
ja: 'My Projectのドキュメント',
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 指定侧边栏目录
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
const locales = generateLocaleConfig('./docs', {
|
|
118
|
+
sidebarDirs: ['guide', 'api', 'examples'],
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 自定义翻译
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
const locales = generateLocaleConfig('./docs', {
|
|
126
|
+
translations: {
|
|
127
|
+
ko: {
|
|
128
|
+
editLinkText: 'GitHub에서 편집',
|
|
129
|
+
docFooter: { prev: '이전', next: '다음' },
|
|
130
|
+
outline: { label: '목차' },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## 仅生成侧边栏
|
|
137
|
+
|
|
138
|
+
如果您想手动配置导航但自动生成侧边栏:
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
import { defineConfig } from 'vitepress';
|
|
142
|
+
import { generateSidebarConfig } from '@llm-translate/cli';
|
|
143
|
+
|
|
144
|
+
const sidebars = generateSidebarConfig('./docs', {
|
|
145
|
+
defaultLocale: 'en',
|
|
146
|
+
locales: ['ko'],
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
export default defineConfig({
|
|
150
|
+
locales: {
|
|
151
|
+
root: {
|
|
152
|
+
label: 'English',
|
|
153
|
+
themeConfig: {
|
|
154
|
+
nav: [/* custom nav */],
|
|
155
|
+
sidebar: sidebars.root,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
ko: {
|
|
159
|
+
label: '한국어',
|
|
160
|
+
themeConfig: {
|
|
161
|
+
nav: [/* custom nav */],
|
|
162
|
+
sidebar: sidebars.ko,
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 单一语言环境生成
|
|
170
|
+
|
|
171
|
+
为单一语言环境生成配置:
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { generateLocale } from '@llm-translate/cli';
|
|
175
|
+
|
|
176
|
+
const koConfig = generateLocale('./docs', 'ko', {
|
|
177
|
+
defaultLocale: 'en',
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Use in your config
|
|
181
|
+
export default defineConfig({
|
|
182
|
+
locales: {
|
|
183
|
+
ko: koConfig,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## 实用函数
|
|
189
|
+
|
|
190
|
+
### detectLocales
|
|
191
|
+
|
|
192
|
+
通过扫描语言环境目录自动检测可用的语言环境:
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
import { detectLocales } from '@llm-translate/cli';
|
|
196
|
+
|
|
197
|
+
const locales = detectLocales('./docs', 'en');
|
|
198
|
+
// Returns: ['ko', 'ja', 'zh'] (based on directories found)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### detectSidebarDirs
|
|
202
|
+
|
|
203
|
+
自动检测应出现在侧边栏中的目录:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { detectSidebarDirs } from '@llm-translate/cli';
|
|
207
|
+
|
|
208
|
+
const dirs = detectSidebarDirs('./docs');
|
|
209
|
+
// Returns: ['guide', 'api', 'cli'] (excludes locale dirs, assets, etc.)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## 标题提取
|
|
213
|
+
|
|
214
|
+
辅助工具按以下顺序提取页面标题:
|
|
215
|
+
1. 前置元数据 `title` 字段
|
|
216
|
+
2. 文件中的第一个 `#` 标题
|
|
217
|
+
3. 转换为标题格式的文件名
|
|
218
|
+
|
|
219
|
+
前置元数据示例:
|
|
220
|
+
```yaml
|
|
221
|
+
---
|
|
222
|
+
title: Getting Started
|
|
223
|
+
---
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## 默认翻译
|
|
227
|
+
|
|
228
|
+
为常见语言环境提供内置翻译:
|
|
229
|
+
|
|
230
|
+
| 语言环境 | 标签 | 文档页脚 | 大纲 |
|
|
231
|
+
|--------|-------|------------|---------|
|
|
232
|
+
| ko | 한국어 | 이전/다음 페이지 | 목차 |
|
|
233
|
+
| ja | 日本語 | 前/次のページ | 目次 |
|
|
234
|
+
| zh | 中文 | 上/下一页 | 目录 |
|
|
235
|
+
|
|
236
|
+
## 工作流程
|
|
237
|
+
|
|
238
|
+
多语言文档的典型工作流程:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# 1. Write documentation in English
|
|
242
|
+
docs/
|
|
243
|
+
guide/
|
|
244
|
+
getting-started.md
|
|
245
|
+
configuration.md
|
|
246
|
+
api/
|
|
247
|
+
index.md
|
|
248
|
+
|
|
249
|
+
# 2. Translate to Korean
|
|
250
|
+
llm-translate dir ./docs ./docs/ko --target-lang ko --glossary glossary.json
|
|
251
|
+
|
|
252
|
+
# 3. Update VitePress config to use auto-generation
|
|
253
|
+
# (see examples above)
|
|
254
|
+
|
|
255
|
+
# 4. Build and preview
|
|
256
|
+
npm run docs:build
|
|
257
|
+
npm run docs:preview
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## 注意事项
|
|
261
|
+
|
|
262
|
+
- **使用绝对路径**:始终使用 `import.meta.url` 解析文档目录路径,如基本用法中所示。相对路径可能无法正常工作,因为 VitePress 从项目根目录运行。
|
|
263
|
+
- 语言环境目录必须使用 2 字母代码(例如 `ko` 、 `ja` 、 `zh`)
|
|
264
|
+
- 辅助工具假设翻译文档镜像源结构
|
|
265
|
+
- 自定义导航项(外部链接、下拉菜单)需要手动配置
|
package/docs/zh/index.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: home
|
|
3
|
+
|
|
4
|
+
hero:
|
|
5
|
+
name: llm-translate
|
|
6
|
+
text: LLM 驱动的文档翻译
|
|
7
|
+
tagline: 通过术语表强制执行、质量控制和成本优化来翻译文档
|
|
8
|
+
actions:
|
|
9
|
+
- theme: brand
|
|
10
|
+
text: 开始使用
|
|
11
|
+
link: ./guide/getting-started
|
|
12
|
+
- theme: alt
|
|
13
|
+
text: 在 GitHub 上查看
|
|
14
|
+
link: https://github.com/selenehyun/llm-translate
|
|
15
|
+
|
|
16
|
+
features:
|
|
17
|
+
- icon: 📚
|
|
18
|
+
title: 术语表强制执行
|
|
19
|
+
details: 通过强制执行的术语表条目确保翻译中术语的一致性,永远不会出现误译。
|
|
20
|
+
- icon: 🔄
|
|
21
|
+
title: Self-Refine 质量控制
|
|
22
|
+
details: 使用 AI 驱动的质量评估进行迭代翻译优化,以达到您的质量阈值。
|
|
23
|
+
- icon: 💰
|
|
24
|
+
title: 成本优化
|
|
25
|
+
details: 提示缓存通过缓存术语表和系统提示等重复内容,将 API 成本降低高达 90%。
|
|
26
|
+
- icon: 🔌
|
|
27
|
+
title: 多提供商支持
|
|
28
|
+
details: 支持 Claude、OpenAI 和 Ollama。无需更改工作流程即可切换提供商。
|
|
29
|
+
- icon: 📄
|
|
30
|
+
title: 格式保持
|
|
31
|
+
details: 在翻译过程中保持 Markdown 格式、代码块、链接和文档结构。
|
|
32
|
+
- icon: ⚡
|
|
33
|
+
title: 批量处理
|
|
34
|
+
details: 通过并行处理和进度跟踪翻译整个目录。
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 快速开始
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Install globally
|
|
41
|
+
npm install -g @llm-translate/cli
|
|
42
|
+
|
|
43
|
+
# Set your API key
|
|
44
|
+
export ANTHROPIC_API_KEY=your-key-here
|
|
45
|
+
|
|
46
|
+
# Translate a file
|
|
47
|
+
llm-translate file README.md -o README.ko.md --target ko
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 为什么选择 llm-translate?
|
|
51
|
+
|
|
52
|
+
传统翻译工具在处理技术文档时存在困难:
|
|
53
|
+
|
|
54
|
+
- **术语不一致** - "API endpoint" 每次翻译都不同
|
|
55
|
+
- **格式损坏** - 代码块和 Markdown 被破坏
|
|
56
|
+
- **无质量控制** - 接受 LLM 输出的任何结果
|
|
57
|
+
|
|
58
|
+
llm-translate 通过以下方式解决这些问题:
|