pylmtranslator 0.1.0__tar.gz

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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NoteBlockMR
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,286 @@
1
+ Metadata-Version: 2.4
2
+ Name: pylmtranslator
3
+ Version: 0.1.0
4
+ Summary: Offline pre-translator for RPG Maker MV/MZ LMTranslator cache files.
5
+ Author: NoteBlockMR
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/NoteBlockMR/LMRPGTranslator-Python
8
+ Project-URL: Repository, https://github.com/NoteBlockMR/LMRPGTranslator-Python
9
+ Project-URL: Issues, https://github.com/NoteBlockMR/LMRPGTranslator-Python/issues
10
+ Keywords: rpg-maker,translation,lm-studio,local-llm
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Topic :: Games/Entertainment :: Role-Playing
18
+ Classifier: Topic :: Software Development :: Localization
19
+ Requires-Python: >=3.8
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: PyYAML>=6.0
23
+ Dynamic: license-file
24
+
25
+ # LMRPGTranslator-Python
26
+
27
+ RPG Maker MV/MZ/XP/VX/VX Ace 게임의 **메시지를 추출 → 로컬 LLM(LM Studio)로 번역 → 적용**하는 오프라인 사전 번역기입니다.
28
+
29
+ 기존 [LMTranslator.js](https://github.com/NoteBlockMR/LMRPGTranslator) 플러그인이 게임 플레이 중 **실시간**으로 번역하는 것과 달리, 이 도구는 게임을 켜기 전에 **미리 전부 번역**해 둡니다. 실시간 API 호출로 인한 렉이 없고, 번역 품질을 미리 검수할 수 있습니다.
30
+
31
+ > 원문은 그대로 두지 않고 두 가지 방식으로 "적용"할 수 있습니다.
32
+ > 1. **캐시 파일**(`LMTranslatorCache.json`) 생성 → MV/MZ의 LMTranslator.js 플러그인이 런타임에 읽어 표시
33
+ > 2. **게임 데이터 파일에 직접 덮어쓰기** (`--apply`) → 플러그인 없이도 번역 적용 (원본은 `.bak` 백업)
34
+
35
+ ---
36
+
37
+ ## 🚀 빠른 시작
38
+
39
+ ```bash
40
+ pip install pylmtranslator
41
+ ```
42
+
43
+ PyPI 릴리스 전 최신 GitHub 버전을 바로 설치하려면:
44
+
45
+ ```bash
46
+ pip install git+https://github.com/NoteBlockMR/LMRPGTranslator-Python.git
47
+ ```
48
+
49
+ RPG Maker 게임의 데이터 폴더가 있는 위치에서 실행합니다.
50
+
51
+ - MV/MZ: `data/` 또는 `www/data/`
52
+ - XP/VX/VX Ace: `Data/`
53
+
54
+ ```bash
55
+ lmt
56
+ ```
57
+
58
+ 처음 실행하면 현재 폴더에 `config.yml`이 생성되고, 설정 내용이 터미널에 출력됩니다. `model`, `language`, `paths.data_dir`, `characters` 등을 수정한 뒤 다시 실행하세요.
59
+
60
+ ```bash
61
+ lmt
62
+ ```
63
+
64
+ 캐시를 만든 뒤 게임 JSON 파일에 직접 적용하려면:
65
+
66
+ ```bash
67
+ lmt --apply
68
+ ```
69
+
70
+ ---
71
+
72
+ ## ✨ 특징
73
+
74
+ - **정확한 메시지 추출**: 메시지창(101/401), 스크롤 텍스트(105/405), 주석의 `<ActiveMessage>`(108/408)
75
+ - **Ruby 엔진 지원**: XP(`.rxdata`), VX(`.rvdata`), VX Ace(`.rvdata2`)의 Ruby Marshal 데이터를 직접 읽고 씀
76
+ - **이름박스/제어코드 보존**: `\n<...>` 화자 박스, `\N[id]` 배우 코드, `\C[n]`, `\I[n]`, `\.` 등 RPG Maker 제어코드를 그대로 유지
77
+ - **화자별 캐릭터 프롬프트**: 등장인물 성격/말투에 맞춘 번역
78
+ - **이름/용어 고정표(glossary)**: 인명·용어의 한글 표기를 일관되게 고정, 오표기 자동 보정
79
+ - **언어 검증 + 재시도**: 대상이 한국어인데 결과에 한글이 없으면 자동 재요청
80
+ - **원문 백업 + 재개**: 추출 결과를 백업해 두고, 중단되면 다음 실행 때 이어서 번역
81
+ - **크래시 안전 캐시**: 일정 개수마다 원자적으로 저장
82
+ - **진행률/ETA 표시**
83
+
84
+ ---
85
+
86
+ ## 📦 설치
87
+
88
+ Python 3.8+ 와 [LM Studio](https://lmstudio.ai/)가 필요합니다.
89
+
90
+ ### PyPI에서 설치
91
+
92
+ ```bash
93
+ pip install pylmtranslator
94
+ ```
95
+
96
+ ### GitHub에서 최신 버전 설치
97
+
98
+ ```bash
99
+ pip install git+https://github.com/NoteBlockMR/LMRPGTranslator-Python.git
100
+ ```
101
+
102
+ 설치 후 `lmt` 명령을 사용할 수 있습니다.
103
+
104
+ ```bash
105
+ lmt --help
106
+ ```
107
+
108
+ 소스에서 직접 실행하려면 다음처럼 의존성을 설치한 뒤 기존 스크립트 명령도 사용할 수 있습니다.
109
+
110
+ ```bash
111
+ pip install -r requirements.txt
112
+ python lm_pretranslate.py --help
113
+ ```
114
+
115
+ 외부 의존성은 `PyYAML` 하나뿐입니다(설정 파일 파싱용). 나머지는 모두 Python 표준 라이브러리입니다.
116
+
117
+ LM Studio에서 모델을 로드하고 **Local Server → Start Server**(기본 포트 1234)를 켜 두세요.
118
+
119
+ ---
120
+
121
+ ## 🚀 사용법
122
+
123
+ ### 1. 설정 (`config.yml`)
124
+
125
+ 처음 실행하면 현재 폴더에 기본 `config.yml`이 생성됩니다.
126
+
127
+ ```yaml
128
+ engine: "auto" # auto, mv_mz, xp, vx, vxace
129
+
130
+ api:
131
+ url: "http://localhost:1234/v1/chat/completions"
132
+ model: "your-model-name" # LM Studio에 로드된 모델 이름
133
+ concurrency: 1 # 동시 번역 요청 수
134
+ request_cooldown_ms: 0 # 오프라인 배치에서는 0이 가장 빠름
135
+
136
+ language:
137
+ source: "English" # 원문 언어
138
+ target: "Korean" # 번역 대상 언어
139
+
140
+ paths:
141
+ data_dir: "data" # MV/MZ는 data, XP/VX/VX Ace는 Data
142
+
143
+ rgss:
144
+ encoding: "utf-8" # XP/VX/VX Ace 문자열 인코딩. 필요 시 cp932/cp949
145
+
146
+ glossary: |
147
+ Vore=보어|포어
148
+
149
+ characters:
150
+ # 캐릭터별 말투 보정이 필요하면 아래처럼 추가합니다.
151
+ # name 은 게임 메시지의 화자 이름과 정확히 같아야 합니다.
152
+ - name: "Maria"
153
+ personality: "차분하고 정중하지만 단호한 말투. 상대를 가볍게 놀리듯 말함."
154
+ custom_prompt: ""
155
+
156
+ - name: "Guard"
157
+ personality: "거칠고 짧게 말하는 경비병. 명령조와 반말을 자주 사용함."
158
+ custom_prompt: ""
159
+ ```
160
+
161
+ 캐릭터별 말투가 필요 없으면 `characters` 항목은 비워둬도 됩니다. 더 강하게 지시하고 싶은 캐릭터는 `custom_prompt`에 전용 프롬프트를 넣을 수 있습니다.
162
+
163
+ ```yaml
164
+ characters:
165
+ - name: "Narrator"
166
+ personality: "담담하고 문학적인 나레이션."
167
+ custom_prompt: |
168
+ You are a professional game translator.
169
+ Translate into natural Korean narration.
170
+ Output only the translation.
171
+ ```
172
+
173
+ 프롬프트, 캐릭터 성격, 이름 고정표 등 자세한 항목은 생성된 `config.yml` 주석을 참고하세요.
174
+
175
+ ### XP/VX/VX Ace 사용
176
+
177
+ XP/VX/VX Ace는 JSON이 아니라 Ruby Marshal 데이터 파일을 사용합니다.
178
+
179
+ | 엔진 | 데이터 파일 | 설정 |
180
+ |---|---|---|
181
+ | RPG Maker XP | `Data/*.rxdata` | `engine: "xp"` |
182
+ | RPG Maker VX | `Data/*.rvdata` | `engine: "vx"` |
183
+ | RPG Maker VX Ace | `Data/*.rvdata2` | `engine: "vxace"` |
184
+
185
+ `engine: "auto"`이면 데이터 폴더의 확장자를 보고 자동으로 감지합니다.
186
+
187
+ ```yaml
188
+ engine: "vxace"
189
+
190
+ paths:
191
+ data_dir: "Data"
192
+
193
+ rgss:
194
+ encoding: "utf-8"
195
+ ```
196
+
197
+ 일본어 XP/VX 게임에서 글자가 깨지면 `rgss.encoding`을 `cp932`로 바꿔 보세요. 한국어 구형 게임 데이터라면 `cp949`가 맞을 수 있습니다.
198
+
199
+ ### 2. 번역 (추출 → 캐시)
200
+
201
+ ```bash
202
+ lmt
203
+ ```
204
+
205
+ - 데이터 폴더의 모든 메시지를 추출해 원문을 백업(`LMTranslator_source.json`)하고, LM Studio로 번역해 캐시(`LMTranslatorCache.json`)에 저장합니다.
206
+ - 중단해도 다음 실행 때 캐시에 없는 것만 이어서 번역합니다(재개).
207
+
208
+ ### 3. 적용 (캐시 → 게임 파일)
209
+
210
+ ```bash
211
+ lmt --apply
212
+ ```
213
+
214
+ - 캐시의 번역문을 `Map*.json`, `Map*.rvdata2` 등 데이터 파일에 **직접 덮어씁니다.** 원본은 최초 1회 `.bak`로 백업됩니다.
215
+ - 이 방식은 플러그인 없이 번역이 적용됩니다.
216
+
217
+ > 캐시 파일 방식은 MV/MZ의 LMTranslator.js 플러그인용입니다. XP/VX/VX Ace는 `--apply`로 Ruby 데이터 파일에 직접 적용하는 흐름을 사용하세요.
218
+
219
+ ### 옵션
220
+
221
+ | 옵션 | 설명 |
222
+ |---|---|
223
+ | `--config <파일>` | 설정 파일 지정 (기본 `config.yml`) |
224
+ | `--dry-run` | 추출/미리보기만, 번역은 하지 않음 |
225
+ | `--limit N` | 앞 N개만 번역(테스트용) |
226
+ | `--no-resume` | 캐시를 무시하고 전부 다시 번역 |
227
+ | `--rescan` | 원문 백업을 무시하고 data 폴더를 다시 스캔 |
228
+ | `--apply` | 캐시를 게임 파일에 직접 덮어쓰기(+`.bak`) |
229
+
230
+ ---
231
+
232
+ ### DB 번역 안전장치
233
+
234
+ `scan.translate_database: true`를 켜면 아이템, 스킬, 장비, 상태, 시스템 용어 같은 DB 텍스트도 번역합니다. 적용할 때는 플러그인 오류를 피하기 위해 다음 토큰이 원문과 번역문에서 정확히 같은 경우에만 덮어씁니다.
235
+
236
+ - RPG Maker 제어코드: `\c[20]`, `\I[1]`, `\V[3]` 등
237
+ - 플러그인/노트 태그: `<Custom Eval>`, `<Enable Switch: 1>` 등
238
+ - 포맷 자리표시자: `%1`, `%2` 등
239
+
240
+ 번역 모델이 이 토큰을 지우거나 바꾸면 해당 DB 항목은 원문을 유지하고, 적용 로그에 `안전하지 않은 DB 번역`으로 표시됩니다.
241
+
242
+ ---
243
+
244
+ ## ⚙️ 동작 원리
245
+
246
+ 1. MV/MZ는 `data/*.json`, XP/VX/VX Ace는 `Data/*.rxdata/.rvdata/.rvdata2`를 스캔해 이벤트 커맨드(메시지/스크롤/주석)를 찾습니다.
247
+ 2. 화자 이름과 본문을 분리하고(`\N[id]`는 배우 이름으로 해석), `화자||원문`을 키로 사용합니다.
248
+ 3. 화자별 시스템 프롬프트 + 용어 고정표로 LM Studio에 번역을 요청합니다.
249
+ 4. 언어 검증을 통과한 결과만 캐시에 저장합니다.
250
+ 5. `--apply` 시 동일한 키 매칭으로 원문을 번역문으로 교체하되, 이름박스·제어코드·줄 구조는 보존합니다.
251
+
252
+ ---
253
+
254
+ ## ⚠️ 주의사항
255
+
256
+ - **저작권**: 이 저장소에는 게임 데이터(`data/`)가 포함되지 않습니다. 번역할 게임의 데이터는 본인이 정당하게 보유한 것이어야 합니다.
257
+ - **줄 밀림(overflow)**: 직접 적용(`--apply`) 방식은 런타임 자동 줄바꿈이 없습니다. 번역문이 길면 메시지창을 넘칠 수 있습니다(프롬프트로 줄 수를 제한하지만 완벽하지 않음).
258
+ - **백업**: `--apply`는 각 파일을 최초 1회 `.bak`로 백업합니다. 재번역하려면 `.bak`에서 복원하거나 원문 백업(`LMTranslator_source.json`)을 활용하세요.
259
+ - **모델 품질**: 작은 모델일수록 오역·제어코드 손상 가능성이 높습니다. 사전 번역이므로 속도보다 품질 좋은 모델을 권장합니다.
260
+
261
+ * 💖 [Patreon에서 후원하기](https://www.patreon.com/c/AINote/membership)
262
+ * 🌟 [AINote 멤버십 가입](https://www.patreon.com/c/AINote/membership)
263
+
264
+ ---
265
+
266
+ ## 📄 라이선스
267
+
268
+ MIT
269
+
270
+ ---
271
+
272
+ ## 🚢 관리자용: PyPI 배포 설정
273
+
274
+ PyPI Trusted Publisher 등록 폼에는 다음 값을 입력하세요.
275
+
276
+ | 항목 | 값 |
277
+ |---|---|
278
+ | PyPI 프로젝트 이름 | `pylmtranslator` |
279
+ | 소유자 | `NoteBlockMR` |
280
+ | 저장소 이름 | `LMRPGTranslator-Python` |
281
+ | Workflow 이름 | `publish.yml` |
282
+ | 환경 이름 | `pypi` |
283
+
284
+ GitHub에서 새 Release를 발행하거나 Actions에서 `Publish Python package` workflow를 수동 실행하면 PyPI에 업로드됩니다.
285
+
286
+ 배포 전에 `pyproject.toml`의 `version` 값을 올려야 합니다. PyPI는 같은 버전 번호를 두 번 업로드할 수 없습니다.
@@ -0,0 +1,262 @@
1
+ # LMRPGTranslator-Python
2
+
3
+ RPG Maker MV/MZ/XP/VX/VX Ace 게임의 **메시지를 추출 → 로컬 LLM(LM Studio)로 번역 → 적용**하는 오프라인 사전 번역기입니다.
4
+
5
+ 기존 [LMTranslator.js](https://github.com/NoteBlockMR/LMRPGTranslator) 플러그인이 게임 플레이 중 **실시간**으로 번역하는 것과 달리, 이 도구는 게임을 켜기 전에 **미리 전부 번역**해 둡니다. 실시간 API 호출로 인한 렉이 없고, 번역 품질을 미리 검수할 수 있습니다.
6
+
7
+ > 원문은 그대로 두지 않고 두 가지 방식으로 "적용"할 수 있습니다.
8
+ > 1. **캐시 파일**(`LMTranslatorCache.json`) 생성 → MV/MZ의 LMTranslator.js 플러그인이 런타임에 읽어 표시
9
+ > 2. **게임 데이터 파일에 직접 덮어쓰기** (`--apply`) → 플러그인 없이도 번역 적용 (원본은 `.bak` 백업)
10
+
11
+ ---
12
+
13
+ ## 🚀 빠른 시작
14
+
15
+ ```bash
16
+ pip install pylmtranslator
17
+ ```
18
+
19
+ PyPI 릴리스 전 최신 GitHub 버전을 바로 설치하려면:
20
+
21
+ ```bash
22
+ pip install git+https://github.com/NoteBlockMR/LMRPGTranslator-Python.git
23
+ ```
24
+
25
+ RPG Maker 게임의 데이터 폴더가 있는 위치에서 실행합니다.
26
+
27
+ - MV/MZ: `data/` 또는 `www/data/`
28
+ - XP/VX/VX Ace: `Data/`
29
+
30
+ ```bash
31
+ lmt
32
+ ```
33
+
34
+ 처음 실행하면 현재 폴더에 `config.yml`이 생성되고, 설정 내용이 터미널에 출력됩니다. `model`, `language`, `paths.data_dir`, `characters` 등을 수정한 뒤 다시 실행하세요.
35
+
36
+ ```bash
37
+ lmt
38
+ ```
39
+
40
+ 캐시를 만든 뒤 게임 JSON 파일에 직접 적용하려면:
41
+
42
+ ```bash
43
+ lmt --apply
44
+ ```
45
+
46
+ ---
47
+
48
+ ## ✨ 특징
49
+
50
+ - **정확한 메시지 추출**: 메시지창(101/401), 스크롤 텍스트(105/405), 주석의 `<ActiveMessage>`(108/408)
51
+ - **Ruby 엔진 지원**: XP(`.rxdata`), VX(`.rvdata`), VX Ace(`.rvdata2`)의 Ruby Marshal 데이터를 직접 읽고 씀
52
+ - **이름박스/제어코드 보존**: `\n<...>` 화자 박스, `\N[id]` 배우 코드, `\C[n]`, `\I[n]`, `\.` 등 RPG Maker 제어코드를 그대로 유지
53
+ - **화자별 캐릭터 프롬프트**: 등장인물 성격/말투에 맞춘 번역
54
+ - **이름/용어 고정표(glossary)**: 인명·용어의 한글 표기를 일관되게 고정, 오표기 자동 보정
55
+ - **언어 검증 + 재시도**: 대상이 한국어인데 결과에 한글이 없으면 자동 재요청
56
+ - **원문 백업 + 재개**: 추출 결과를 백업해 두고, 중단되면 다음 실행 때 이어서 번역
57
+ - **크래시 안전 캐시**: 일정 개수마다 원자적으로 저장
58
+ - **진행률/ETA 표시**
59
+
60
+ ---
61
+
62
+ ## 📦 설치
63
+
64
+ Python 3.8+ 와 [LM Studio](https://lmstudio.ai/)가 필요합니다.
65
+
66
+ ### PyPI에서 설치
67
+
68
+ ```bash
69
+ pip install pylmtranslator
70
+ ```
71
+
72
+ ### GitHub에서 최신 버전 설치
73
+
74
+ ```bash
75
+ pip install git+https://github.com/NoteBlockMR/LMRPGTranslator-Python.git
76
+ ```
77
+
78
+ 설치 후 `lmt` 명령을 사용할 수 있습니다.
79
+
80
+ ```bash
81
+ lmt --help
82
+ ```
83
+
84
+ 소스에서 직접 실행하려면 다음처럼 의존성을 설치한 뒤 기존 스크립트 명령도 사용할 수 있습니다.
85
+
86
+ ```bash
87
+ pip install -r requirements.txt
88
+ python lm_pretranslate.py --help
89
+ ```
90
+
91
+ 외부 의존성은 `PyYAML` 하나뿐입니다(설정 파일 파싱용). 나머지는 모두 Python 표준 라이브러리입니다.
92
+
93
+ LM Studio에서 모델을 로드하고 **Local Server → Start Server**(기본 포트 1234)를 켜 두세요.
94
+
95
+ ---
96
+
97
+ ## 🚀 사용법
98
+
99
+ ### 1. 설정 (`config.yml`)
100
+
101
+ 처음 실행하면 현재 폴더에 기본 `config.yml`이 생성됩니다.
102
+
103
+ ```yaml
104
+ engine: "auto" # auto, mv_mz, xp, vx, vxace
105
+
106
+ api:
107
+ url: "http://localhost:1234/v1/chat/completions"
108
+ model: "your-model-name" # LM Studio에 로드된 모델 이름
109
+ concurrency: 1 # 동시 번역 요청 수
110
+ request_cooldown_ms: 0 # 오프라인 배치에서는 0이 가장 빠름
111
+
112
+ language:
113
+ source: "English" # 원문 언어
114
+ target: "Korean" # 번역 대상 언어
115
+
116
+ paths:
117
+ data_dir: "data" # MV/MZ는 data, XP/VX/VX Ace는 Data
118
+
119
+ rgss:
120
+ encoding: "utf-8" # XP/VX/VX Ace 문자열 인코딩. 필요 시 cp932/cp949
121
+
122
+ glossary: |
123
+ Vore=보어|포어
124
+
125
+ characters:
126
+ # 캐릭터별 말투 보정이 필요하면 아래처럼 추가합니다.
127
+ # name 은 게임 메시지의 화자 이름과 정확히 같아야 합니다.
128
+ - name: "Maria"
129
+ personality: "차분하고 정중하지만 단호한 말투. 상대를 가볍게 놀리듯 말함."
130
+ custom_prompt: ""
131
+
132
+ - name: "Guard"
133
+ personality: "거칠고 짧게 말하는 경비병. 명령조와 반말을 자주 사용함."
134
+ custom_prompt: ""
135
+ ```
136
+
137
+ 캐릭터별 말투가 필요 없으면 `characters` 항목은 비워둬도 됩니다. 더 강하게 지시하고 싶은 캐릭터는 `custom_prompt`에 전용 프롬프트를 넣을 수 있습니다.
138
+
139
+ ```yaml
140
+ characters:
141
+ - name: "Narrator"
142
+ personality: "담담하고 문학적인 나레이션."
143
+ custom_prompt: |
144
+ You are a professional game translator.
145
+ Translate into natural Korean narration.
146
+ Output only the translation.
147
+ ```
148
+
149
+ 프롬프트, 캐릭터 성격, 이름 고정표 등 자세한 항목은 생성된 `config.yml` 주석을 참고하세요.
150
+
151
+ ### XP/VX/VX Ace 사용
152
+
153
+ XP/VX/VX Ace는 JSON이 아니라 Ruby Marshal 데이터 파일을 사용합니다.
154
+
155
+ | 엔진 | 데이터 파일 | 설정 |
156
+ |---|---|---|
157
+ | RPG Maker XP | `Data/*.rxdata` | `engine: "xp"` |
158
+ | RPG Maker VX | `Data/*.rvdata` | `engine: "vx"` |
159
+ | RPG Maker VX Ace | `Data/*.rvdata2` | `engine: "vxace"` |
160
+
161
+ `engine: "auto"`이면 데이터 폴더의 확장자를 보고 자동으로 감지합니다.
162
+
163
+ ```yaml
164
+ engine: "vxace"
165
+
166
+ paths:
167
+ data_dir: "Data"
168
+
169
+ rgss:
170
+ encoding: "utf-8"
171
+ ```
172
+
173
+ 일본어 XP/VX 게임에서 글자가 깨지면 `rgss.encoding`을 `cp932`로 바꿔 보세요. 한국어 구형 게임 데이터라면 `cp949`가 맞을 수 있습니다.
174
+
175
+ ### 2. 번역 (추출 → 캐시)
176
+
177
+ ```bash
178
+ lmt
179
+ ```
180
+
181
+ - 데이터 폴더의 모든 메시지를 추출해 원문을 백업(`LMTranslator_source.json`)하고, LM Studio로 번역해 캐시(`LMTranslatorCache.json`)에 저장합니다.
182
+ - 중단해도 다음 실행 때 캐시에 없는 것만 이어서 번역합니다(재개).
183
+
184
+ ### 3. 적용 (캐시 → 게임 파일)
185
+
186
+ ```bash
187
+ lmt --apply
188
+ ```
189
+
190
+ - 캐시의 번역문을 `Map*.json`, `Map*.rvdata2` 등 데이터 파일에 **직접 덮어씁니다.** 원본은 최초 1회 `.bak`로 백업됩니다.
191
+ - 이 방식은 플러그인 없이 번역이 적용됩니다.
192
+
193
+ > 캐시 파일 방식은 MV/MZ의 LMTranslator.js 플러그인용입니다. XP/VX/VX Ace는 `--apply`로 Ruby 데이터 파일에 직접 적용하는 흐름을 사용하세요.
194
+
195
+ ### 옵션
196
+
197
+ | 옵션 | 설명 |
198
+ |---|---|
199
+ | `--config <파일>` | 설정 파일 지정 (기본 `config.yml`) |
200
+ | `--dry-run` | 추출/미리보기만, 번역은 하지 않음 |
201
+ | `--limit N` | 앞 N개만 번역(테스트용) |
202
+ | `--no-resume` | 캐시를 무시하고 전부 다시 번역 |
203
+ | `--rescan` | 원문 백업을 무시하고 data 폴더를 다시 스캔 |
204
+ | `--apply` | 캐시를 게임 파일에 직접 덮어쓰기(+`.bak`) |
205
+
206
+ ---
207
+
208
+ ### DB 번역 안전장치
209
+
210
+ `scan.translate_database: true`를 켜면 아이템, 스킬, 장비, 상태, 시스템 용어 같은 DB 텍스트도 번역합니다. 적용할 때는 플러그인 오류를 피하기 위해 다음 토큰이 원문과 번역문에서 정확히 같은 경우에만 덮어씁니다.
211
+
212
+ - RPG Maker 제어코드: `\c[20]`, `\I[1]`, `\V[3]` 등
213
+ - 플러그인/노트 태그: `<Custom Eval>`, `<Enable Switch: 1>` 등
214
+ - 포맷 자리표시자: `%1`, `%2` 등
215
+
216
+ 번역 모델이 이 토큰을 지우거나 바꾸면 해당 DB 항목은 원문을 유지하고, 적용 로그에 `안전하지 않은 DB 번역`으로 표시됩니다.
217
+
218
+ ---
219
+
220
+ ## ⚙️ 동작 원리
221
+
222
+ 1. MV/MZ는 `data/*.json`, XP/VX/VX Ace는 `Data/*.rxdata/.rvdata/.rvdata2`를 스캔해 이벤트 커맨드(메시지/스크롤/주석)를 찾습니다.
223
+ 2. 화자 이름과 본문을 분리하고(`\N[id]`는 배우 이름으로 해석), `화자||원문`을 키로 사용합니다.
224
+ 3. 화자별 시스템 프롬프트 + 용어 고정표로 LM Studio에 번역을 요청합니다.
225
+ 4. 언어 검증을 통과한 결과만 캐시에 저장합니다.
226
+ 5. `--apply` 시 동일한 키 매칭으로 원문을 번역문으로 교체하되, 이름박스·제어코드·줄 구조는 보존합니다.
227
+
228
+ ---
229
+
230
+ ## ⚠️ 주의사항
231
+
232
+ - **저작권**: 이 저장소에는 게임 데이터(`data/`)가 포함되지 않습니다. 번역할 게임의 데이터는 본인이 정당하게 보유한 것이어야 합니다.
233
+ - **줄 밀림(overflow)**: 직접 적용(`--apply`) 방식은 런타임 자동 줄바꿈이 없습니다. 번역문이 길면 메시지창을 넘칠 수 있습니다(프롬프트로 줄 수를 제한하지만 완벽하지 않음).
234
+ - **백업**: `--apply`는 각 파일을 최초 1회 `.bak`로 백업합니다. 재번역하려면 `.bak`에서 복원하거나 원문 백업(`LMTranslator_source.json`)을 활용하세요.
235
+ - **모델 품질**: 작은 모델일수록 오역·제어코드 손상 가능성이 높습니다. 사전 번역이므로 속도보다 품질 좋은 모델을 권장합니다.
236
+
237
+ * 💖 [Patreon에서 후원하기](https://www.patreon.com/c/AINote/membership)
238
+ * 🌟 [AINote 멤버십 가입](https://www.patreon.com/c/AINote/membership)
239
+
240
+ ---
241
+
242
+ ## 📄 라이선스
243
+
244
+ MIT
245
+
246
+ ---
247
+
248
+ ## 🚢 관리자용: PyPI 배포 설정
249
+
250
+ PyPI Trusted Publisher 등록 폼에는 다음 값을 입력하세요.
251
+
252
+ | 항목 | 값 |
253
+ |---|---|
254
+ | PyPI 프로젝트 이름 | `pylmtranslator` |
255
+ | 소유자 | `NoteBlockMR` |
256
+ | 저장소 이름 | `LMRPGTranslator-Python` |
257
+ | Workflow 이름 | `publish.yml` |
258
+ | 환경 이름 | `pypi` |
259
+
260
+ GitHub에서 새 Release를 발행하거나 Actions에서 `Publish Python package` workflow를 수동 실행하면 PyPI에 업로드됩니다.
261
+
262
+ 배포 전에 `pyproject.toml`의 `version` 값을 올려야 합니다. PyPI는 같은 버전 번호를 두 번 업로드할 수 없습니다.