@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
+ | 모델 | RAM | 품질 | 최적 용도 |
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
+ 완전한 설정 지침, GPU 최적화, 문제 해결 및 고급 구성은 [Ollama를 사용한 로컬 번역](./ollama)을 참조하세요.
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
+ - 이전 청크 컨텍스트 (연속성을 위해)
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. 각 로케일에 대한 nav 및 사이드바를 생성합니다
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
+ nav는 수동으로 구성하고 사이드바만 자동 생성하려는 경우:
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. Frontmatter `title` 필드
216
+ 2. 파일의 첫 번째 `#` 헤딩
217
+ 3. Title Case로 변환된 파일명
218
+
219
+ Frontmatter 예제:
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` 를 사용하여 docs 디렉토리 경로를 해석하십시오. VitePress가 프로젝트 루트에서 실행되므로 상대 경로는 올바르게 작동하지 않을 수 있습니다.
263
+ - 로케일 디렉토리는 2글자 코드를 사용해야 합니다(예:`ko `,` ja `,` zh`)
264
+ - 헬퍼는 번역된 문서가 소스 구조를 미러링한다고 가정합니다
265
+ - 사용자 정의 nav 항목(외부 링크, 드롭다운)은 수동 구성이 필요합니다
@@ -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는 다음과 같이 이러한 문제를 해결합니다: