@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.
Files changed (157) hide show
  1. package/.dockerignore +51 -0
  2. package/.env.example +33 -0
  3. package/.github/workflows/docs-pages.yml +57 -0
  4. package/.github/workflows/release.yml +49 -0
  5. package/.translaterc.json +44 -0
  6. package/CLAUDE.md +243 -0
  7. package/Dockerfile +55 -0
  8. package/README.md +371 -0
  9. package/RFC.md +1595 -0
  10. package/dist/cli/index.d.ts +2 -0
  11. package/dist/cli/index.js +4494 -0
  12. package/dist/cli/index.js.map +1 -0
  13. package/dist/index.d.ts +1152 -0
  14. package/dist/index.js +3841 -0
  15. package/dist/index.js.map +1 -0
  16. package/docker-compose.yml +56 -0
  17. package/docs/.vitepress/config.ts +161 -0
  18. package/docs/api/agent.md +262 -0
  19. package/docs/api/engine.md +274 -0
  20. package/docs/api/index.md +171 -0
  21. package/docs/api/providers.md +304 -0
  22. package/docs/changelog.md +64 -0
  23. package/docs/cli/dir.md +243 -0
  24. package/docs/cli/file.md +213 -0
  25. package/docs/cli/glossary.md +273 -0
  26. package/docs/cli/index.md +129 -0
  27. package/docs/cli/init.md +158 -0
  28. package/docs/cli/serve.md +211 -0
  29. package/docs/glossary.json +235 -0
  30. package/docs/guide/chunking.md +272 -0
  31. package/docs/guide/configuration.md +139 -0
  32. package/docs/guide/cost-optimization.md +237 -0
  33. package/docs/guide/docker.md +371 -0
  34. package/docs/guide/getting-started.md +150 -0
  35. package/docs/guide/glossary.md +241 -0
  36. package/docs/guide/index.md +86 -0
  37. package/docs/guide/ollama.md +515 -0
  38. package/docs/guide/prompt-caching.md +221 -0
  39. package/docs/guide/providers.md +232 -0
  40. package/docs/guide/quality-control.md +206 -0
  41. package/docs/guide/vitepress-integration.md +265 -0
  42. package/docs/index.md +63 -0
  43. package/docs/ja/api/agent.md +262 -0
  44. package/docs/ja/api/engine.md +274 -0
  45. package/docs/ja/api/index.md +171 -0
  46. package/docs/ja/api/providers.md +304 -0
  47. package/docs/ja/changelog.md +64 -0
  48. package/docs/ja/cli/dir.md +243 -0
  49. package/docs/ja/cli/file.md +213 -0
  50. package/docs/ja/cli/glossary.md +273 -0
  51. package/docs/ja/cli/index.md +111 -0
  52. package/docs/ja/cli/init.md +158 -0
  53. package/docs/ja/guide/chunking.md +271 -0
  54. package/docs/ja/guide/configuration.md +139 -0
  55. package/docs/ja/guide/cost-optimization.md +30 -0
  56. package/docs/ja/guide/getting-started.md +150 -0
  57. package/docs/ja/guide/glossary.md +214 -0
  58. package/docs/ja/guide/index.md +32 -0
  59. package/docs/ja/guide/ollama.md +410 -0
  60. package/docs/ja/guide/prompt-caching.md +221 -0
  61. package/docs/ja/guide/providers.md +232 -0
  62. package/docs/ja/guide/quality-control.md +137 -0
  63. package/docs/ja/guide/vitepress-integration.md +265 -0
  64. package/docs/ja/index.md +58 -0
  65. package/docs/ko/api/agent.md +262 -0
  66. package/docs/ko/api/engine.md +274 -0
  67. package/docs/ko/api/index.md +171 -0
  68. package/docs/ko/api/providers.md +304 -0
  69. package/docs/ko/changelog.md +64 -0
  70. package/docs/ko/cli/dir.md +243 -0
  71. package/docs/ko/cli/file.md +213 -0
  72. package/docs/ko/cli/glossary.md +273 -0
  73. package/docs/ko/cli/index.md +111 -0
  74. package/docs/ko/cli/init.md +158 -0
  75. package/docs/ko/guide/chunking.md +271 -0
  76. package/docs/ko/guide/configuration.md +139 -0
  77. package/docs/ko/guide/cost-optimization.md +30 -0
  78. package/docs/ko/guide/getting-started.md +150 -0
  79. package/docs/ko/guide/glossary.md +214 -0
  80. package/docs/ko/guide/index.md +32 -0
  81. package/docs/ko/guide/ollama.md +410 -0
  82. package/docs/ko/guide/prompt-caching.md +221 -0
  83. package/docs/ko/guide/providers.md +232 -0
  84. package/docs/ko/guide/quality-control.md +137 -0
  85. package/docs/ko/guide/vitepress-integration.md +265 -0
  86. package/docs/ko/index.md +58 -0
  87. package/docs/zh/api/agent.md +262 -0
  88. package/docs/zh/api/engine.md +274 -0
  89. package/docs/zh/api/index.md +171 -0
  90. package/docs/zh/api/providers.md +304 -0
  91. package/docs/zh/changelog.md +64 -0
  92. package/docs/zh/cli/dir.md +243 -0
  93. package/docs/zh/cli/file.md +213 -0
  94. package/docs/zh/cli/glossary.md +273 -0
  95. package/docs/zh/cli/index.md +111 -0
  96. package/docs/zh/cli/init.md +158 -0
  97. package/docs/zh/guide/chunking.md +271 -0
  98. package/docs/zh/guide/configuration.md +139 -0
  99. package/docs/zh/guide/cost-optimization.md +30 -0
  100. package/docs/zh/guide/getting-started.md +150 -0
  101. package/docs/zh/guide/glossary.md +214 -0
  102. package/docs/zh/guide/index.md +32 -0
  103. package/docs/zh/guide/ollama.md +410 -0
  104. package/docs/zh/guide/prompt-caching.md +221 -0
  105. package/docs/zh/guide/providers.md +232 -0
  106. package/docs/zh/guide/quality-control.md +137 -0
  107. package/docs/zh/guide/vitepress-integration.md +265 -0
  108. package/docs/zh/index.md +58 -0
  109. package/package.json +91 -0
  110. package/release.config.mjs +15 -0
  111. package/schemas/glossary.schema.json +110 -0
  112. package/src/cli/commands/dir.ts +469 -0
  113. package/src/cli/commands/file.ts +291 -0
  114. package/src/cli/commands/glossary.ts +221 -0
  115. package/src/cli/commands/init.ts +68 -0
  116. package/src/cli/commands/serve.ts +60 -0
  117. package/src/cli/index.ts +64 -0
  118. package/src/cli/options.ts +59 -0
  119. package/src/core/agent.ts +1119 -0
  120. package/src/core/chunker.ts +391 -0
  121. package/src/core/engine.ts +634 -0
  122. package/src/errors.ts +188 -0
  123. package/src/index.ts +147 -0
  124. package/src/integrations/vitepress.ts +549 -0
  125. package/src/parsers/markdown.ts +383 -0
  126. package/src/providers/claude.ts +259 -0
  127. package/src/providers/interface.ts +109 -0
  128. package/src/providers/ollama.ts +379 -0
  129. package/src/providers/openai.ts +308 -0
  130. package/src/providers/registry.ts +153 -0
  131. package/src/server/index.ts +152 -0
  132. package/src/server/middleware/auth.ts +93 -0
  133. package/src/server/middleware/logger.ts +90 -0
  134. package/src/server/routes/health.ts +84 -0
  135. package/src/server/routes/translate.ts +210 -0
  136. package/src/server/types.ts +138 -0
  137. package/src/services/cache.ts +899 -0
  138. package/src/services/config.ts +217 -0
  139. package/src/services/glossary.ts +247 -0
  140. package/src/types/analysis.ts +164 -0
  141. package/src/types/index.ts +265 -0
  142. package/src/types/modes.ts +121 -0
  143. package/src/types/mqm.ts +157 -0
  144. package/src/utils/logger.ts +141 -0
  145. package/src/utils/tokens.ts +116 -0
  146. package/tests/fixtures/glossaries/ml-glossary.json +53 -0
  147. package/tests/fixtures/input/lynq-installation.ko.md +350 -0
  148. package/tests/fixtures/input/lynq-installation.md +350 -0
  149. package/tests/fixtures/input/simple.ko.md +27 -0
  150. package/tests/fixtures/input/simple.md +27 -0
  151. package/tests/unit/chunker.test.ts +229 -0
  152. package/tests/unit/glossary.test.ts +146 -0
  153. package/tests/unit/markdown.test.ts +205 -0
  154. package/tests/unit/tokens.test.ts +81 -0
  155. package/tsconfig.json +28 -0
  156. package/tsup.config.ts +34 -0
  157. 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
+ - 自定义导航项(外部链接、下拉菜单)需要手动配置
@@ -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 通过以下方式解决这些问题: